Java提供了两个类用来进行正则表达式的匹配
Pattern Matcher 两个类都没有公共的构造方法,只能通过静态方法创建对象。
限定符:及规定匹配字符的个数,比如?,+,*,{n},{n,}{n,m}等,默认只匹配一次
贪婪:默认匹配的都是可能长的字符
非贪婪:?当次字符紧随其他限定符时,都是尽可能匹配短的字符串
通过Pattern.compile(regex).matcher(input) 返回的pattern实例的matcher方法构造Matcher对象。
Matcher对象匹配结果查询
find() 如果匹配有结果,返回真,没有匹配到,返回假。查找下一个匹配的结果,要在循环中查找到全部的结果。
find(int start) 重置匹配器,从在原子符start开始进行匹配。
start() 返回匹配到的第一项的在原子符的偏移量。
end() 返回匹配到的最后一项在原子符的偏移量+1。
group() 返回得到的匹配结果,从substring(start(),end()) 得到的结果相同
find()在循环中迭代得到全部的匹配结果 从 end()-start() 可以得知每次匹配到字符的长度
String pattern1="[A-Za-z]";
Pattern pattern= Pattern.compile(pattern1);
String input="345rf4";
Matcher matcher=pattern.matcher(input);
while (matcher.find()){
System.out.println("start:"+matcher.start());
System.out.println("end:"+matcher.end());
System.out.println("length:"+(matcher.end()-matcher.start()));
System.out.println("matcher: "+input.substring(matcher.start(),matcher.end()));
System.out.println("group: "+matcher.group());
}
}
/*
start:3
end:4
length:1
matcher: r
group: r
start:4
end:5
length:1
matcher: f
group: f
*/
matches() 尝试将整个input字符与正则表达式匹配,如果匹配成功返回真,否则返回假。
String pattern1="[A-Za-z]{1,}";
Pattern pattern= Pattern.compile(pattern1);
String input="rfg";
Matcher matcher=pattern.matcher(input);
boolean f= matcher.matches(); //rfg与整个正则表达式匹配,能匹配成功,如果是匹配rfg34 不能匹配成功,因为有数字34不能与正则表达式匹配,返回假
System.out.println(f);
mathes() 与find() 的区别,是find逐步查找input字符串符合正则表达式的部分。
正则表达式中的 [] 和 ()的区别:
[a-z] 是范围匹配,匹配a-z的任意一个字符
(a-z) 是全部匹配,匹配的是a-z的全部字符,匹配一个连续的子串
int groupCount() 返回一共的匹配组
string group(int group) 返回第几个匹配分组的结果,如果没有返回null,从第1个分组开始,第0个是一个特殊的分组,它代表整个表达式,所以它每次都有返回结果。
捕获组,正则表达式regex中使用括号()包囊起来的分组,捕获组是从左到右开始计算其开括号来编号的。
例如:((A)(B(C))),一共有4个分组,从0-3分别是
1:((A)(B(C))) ; 2:(A) ; 3: (B(C)) ; 4:(C)
String pattern1="(a)|(A)";
Pattern pattern= Pattern.compile(pattern1);
String input="aarAfg45";
Matcher matcher=pattern.matcher(input);
while (matcher.find()){
System.out.println("matcher: "+input.substring(matcher.start(),matcher.end()));
System.out.println("group: "+matcher.group(0));
System.out.println("第1个分组(a):"+matcher.group(1));
System.out.println("第2个分组(A):"+matcher.group(2));
}
/*
matcher: a
group: a
第1个分组(a):a
第2个分组(A):null
matcher: a
group: a
第1个分组(a):a
第2个分组(A):null
matcher: A
group: A
第1个分组(a):null
第2个分组(A):A
2
*/
替换
String pattern1="(a)|(A)";
Pattern pattern= Pattern.compile(pattern1);
String input="aarAfg45";
Matcher matcher=pattern.matcher(input);
System.out.println(input);
String s=matcher.replaceAll("&");
System.out.println(s);
String s1=matcher.replaceFirst("&");
System.out.println(s1);
/*
原来的=aarAfg45
s=&&r&fg45
s1=&arAfg45
*/
PatternSyntaxException 是一个非强制异常类,它指示一个正则表达式模式中的语法错误。
字符串的替换,切割,匹配等方法都是基于正则匹配。
字符串的mathes方法是全局匹配,底层是使用Matcher对象的matches方法,而不是find方法。