概述:
正则表达式的匹配模式分为三种:贪婪模式Greedy(默认)、勉强模式Reluctant、侵占模式Possessive。下面将会分别做出具体的讲述。
贪婪模式:
在匹配的过程中,尽可能多的去选择匹配内容,然后逐个递减,直到匹配成功。
例如:待匹配字符串为aweiaaaaaaaaaaaaawei,匹配正则表达式p0为 “ .*wei ”。
首先p0可分为,p1(.*)和子模式p2(wei)两个部分. 其中p1中的量词匹配方式使用默认方式(贪婪型)。
匹配过程:
1. 所有字符aweiaaaaaaaaaaaaawei匹配p1,匹配成功,剩余空字符匹配p2,匹配失败,整体匹配失败。
2. 字符aweiaaaaaaaaaaaaawe匹配p1,匹配成功,剩余字符 i匹配p2,匹配失败,整体匹配失败。
3. 字符aweiaaaaaaaaaaaaaw匹配p1,匹配成功,剩余字符 ei匹配p2,匹配失败,整体匹配失败。
4. 字符aweiaaaaaaaaaaaaa匹配p1,匹配成功,剩余字符 wei匹配p2,匹配成功,整体匹配成功。
public static void main(String[] args) {
// TODO Auto-generated method stub
String content = "aweiaaaaaaaaaaaaawei";
String regex = ".*wei";
Pattern pattern = Pattern.compile(regex);
Matcher matcher =pattern.matcher(content);
while(matcher.find()){
System.out.println("匹配结果:"+matcher.group());
}
}
输出:
匹配结果:aweiaaaaaaaaaaaaawei
勉强模式:
在匹配的过程中,首先尽可能少的去匹配,然后逐个增加,直到匹配成功。
例如:待匹配字符串为aweiaaaaaaaaaaaaawei,匹配正则表达式p0为 “ .*?wei ”。
首先p0可分为,p1(.*?)和子模式p2(wei)两个部分. 其中p1中的量词匹配方式使用(勉强模式)。
1. 空字符匹配p1,匹配成功,字符aweiaaaaaaaaaaaaawei匹配p2,匹配失败,整体匹配失败。
2. 字符a匹配p1,匹配成功,字符weiaaaaaaaaaaaaawei匹配p2,匹配成功(wei),整体匹配成功。
public static void main(String[] args) {
// TODO Auto-generated method stub
String content = "aweiaaaaaaaaaaaaawei";
String regex = ".*?wei";
Pattern pattern = Pattern.compile(regex);
Matcher matcher =pattern.matcher(content);
while(matcher.find()){
System.out.println("匹配结果:"+matcher.group());
}
}
输出:
匹配结果:awei
匹配结果:aaaaaaaaaaaaawei
说明:p2使用贪婪模式匹配,weiaaaaaaaaaaaaawei的匹配过程,weiaaaaaaaaaaaaawei匹配失败,weiaaaaaaaaaaaaawe匹配失败…直到wei匹配成功。最终匹配的结果是awei字符。
侵占模式:
在匹配的过程中,尽可能多的去匹配,一旦匹配成功,就不会改变。
例如:待匹配字符串为aweiaaaaaaaaaaaaawei,匹配正则表达式p0为 “ .*+wei ”。
首先p0可分为,p1(.*+)和子模式p2(wei)两个部分. 其中p1中的量词匹配方式使用(勉强模式)。
1. 字符aweiaaaaaaaaaaaaawei匹配p1,匹配成功,空字符匹配p2,匹配失败,整体匹配失败。
public static void main(String[] args) {
String content = "aweiaaaaaaaaaaaaawei";
String regex = ".*+wei";
Pattern pattern = Pattern.compile(regex);
Matcher matcher =pattern.matcher(content);
//matcher.matches()
if(matcher.find()){
System.out.println("匹配结果:"+matcher.group());
}else{
System.out.println("匹配失败");
}
}
希望对您有所帮助!