正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或者是处理文本。
正则表达式并不仅仅局限于某种语言,但是在每个语言中都有差异。
一个字符串就是一个简单的正则表达式,例如Hello world正则表达式匹配“Hello world”的字符串。
.就是一个正则表达式,匹配任意一个字符例如:“a”或者“1”。
给出如图所示的正则表达式实例:

Java正则表达式和Perl很类似。
java.util.regex包主要包含了如下三个类:
给出如下实例代码:
package regex;
import java.util.regex.Pattern;
public class RegexExample1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String content = "I am runoob" + "from runoob.com";
String pattern = ".*runoob.*";
boolean isMatch = Pattern.matches(pattern, content);
System.out.println("字符串是否包含了'runoob'的字符串?: " + isMatch);
}
}
捕获组是把多个字符当一个单独的单元进行了处理的方法,通过对括号内的字符分组来创建。
例如,正则表达式(dog)创建了一个单一分组,组里包含"d",“o”,和"g"。
捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:
通过调用matcher对象的groupCount方法查看表达式有多少个分组。groupCount方法返回一个int数值,表示matcher对象当前有多个捕获的组。
还有一个特殊的组(group(0)),它总是代表整个表达式。该组不在groupCount的返回值中。
给出如下实例代码:
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 按照指定模式在字符串中查找
String line = "This order wa placed for QT3000! OK?";
String pattern = "(\\D*)(\\d+)(.*)";
// 创建pattern对象
Pattern r = Pattern.compile(pattern);
// 现在创建了matcher对象
Matcher m = r.matcher(line);
if (m.find()) {
System.out.println("Found value: " + m.group(0));
System.out.println("Found value: " + m.group(1));
System.out.println("Found value: " + m.group(2));
System.out.println("Found value: " + m.group(3));
} else {
System.out.println("NO MATCH");
}
}
}
结果如图所示:

在其他的语法中,\\表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。。
在Java中,\\表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。。
System.out.print("\\"); // 输出为 \
System.out.print("\\\\"); // 输出为 \\
语法详细可以参见这篇文章:Java正则表达式语法示例大全。
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class checkEmail {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 验证的字符串
String str = "service@xsoftlab.net";
// 邮箱验证的规则
String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}";
// 编译正则表达式
Pattern pattern = Pattern.compile(regEx);
// 忽略的大小写的方法
Matcher matcher = pattern.matcher(str);
// 字符串是否正则表达式匹配
boolean rs = matcher.matches();
System.out.println(rs);
}
}
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @ClassName: regexMatchDemo2
*/
public class regexMatchDemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 要验证的字符串
String str = "baike.xsoftlab.net";
// 正则表达式规则
String regEx = "baike.*";
// 编译正则表达式
Pattern pattern = Pattern.compile(regEx);
// 忽略大小写的写法
// Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
// 查找字符串中是否有匹配正则表达式的字符/字符串
boolean rs = matcher.find();
System.out.println(rs);
}
}
根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 “\b” 与单个退格字符匹配,而 “\b” 与单词边界匹配。字符串字面值 “(hello)” 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 “hello”。
索引方法提供了有用的缩影数值,精确表明输入字符串中在哪儿能找到匹配:
查找方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regexStartEnd {
private static final String REGEX = "\\bcat\\b";
private static final String INPUT = "cat cat cat cattie cat";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// 获取 matcher 对象
Matcher m = p.matcher(INPUT);
int count = 0;
while (m.find()) {
count++;
System.out.println("Match number " + count);
System.out.println("start(): " + m.start());
System.out.println("end(): " + m.end());
}
}
}
Start 方法返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引;end 方法最后一个匹配字符的索引加 1。
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class replaceFirstAll {
private static String REGEX = "dog";
private static String INPUT = "The dog says meow. " + "All dogs say meow.";
private static String REPLACE = "cat";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
replaceFirst 和 replaceAll 方法用来替换匹配正则表达式的文本。
注意,不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配。
Matcher类提供了appendReplacement 和 appendTail 方法用于文本替换:
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatchTest {
private static String REGEX = "a*b";
private static String INPUT = "aabfooaabfooabfoobkkk";
private static String REPLACE = "-";
public static void main(String[] args) {
// TODO Auto-generated method stub
Pattern p = Pattern.compile(REGEX);
// 获取 matcher 对象
Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}