概述:
正則表達式的匹配模式分爲三種:貪婪模式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("匹配失敗");
}
}
希望對您有所幫助!