Posted on 2009-10-30 16:13
landor 閱讀(503)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
正則
正則表達(dá)式中有三個(gè)量詞:貪婪、惰性、支配,記錄一下我對(duì)貪婪和惰性的理解
1 貪婪:一下子打算匹配整個(gè)字符串,如果發(fā)現(xiàn)不匹配,就去掉最后一個(gè)字符,進(jìn)行匹配,以此類(lèi)推。一旦匹配成功之后,并不是馬上返回,而是跳躍到下一個(gè)字符的起點(diǎn),再次開(kāi)始貪婪的匹配,舉個(gè)例子:
public static void main(String []args) {
String str="1abbbaabbbaaabbb1234abbbc";
Pattern p2 = Pattern.compile("[^1]*bbb");
Matcher m2 =p2.matcher(str);
while(m2.find()){
System.out.println(m2.group());
}
}
他的執(zhí)行過(guò)程應(yīng)該是這樣:
先找到滿(mǎn)足條件的第一個(gè)字符,所以1會(huì)被過(guò)濾掉,然后進(jìn)行全局匹配
abbbaabbbaaabbb1234abbbc 不匹配
abbbaabbbaaabbb1234abbb 不匹配
abbbaabbbaaabbb1234abb 不匹配


abbbaabbbaaabbb 匹配
之后表達(dá)式會(huì)繼續(xù)尋找這個(gè)字符串后面的匹配的第一個(gè)字符,所以后面的1會(huì)被過(guò)濾掉,然后再進(jìn)行全局匹配,即:
234abbbc 不匹配
234abbb 匹配
所以會(huì)得到兩個(gè)匹配結(jié)果 abbbaabbbaaabbb和234abbb
2 惰性
從第一個(gè)字符開(kāi)始進(jìn)行匹配,如果不匹配,那么就在讀入一個(gè)字符,進(jìn)行整體匹配,以此類(lèi)推
還是看上面的例子,如果是貪婪的,那么正則是這樣[^1]*?bbb,執(zhí)行過(guò)程如下:
先找到滿(mǎn)足條件的第一個(gè)字符,所以1還是被過(guò)濾,從a開(kāi)始,匹配過(guò)程如下
a 不匹配
ab 不匹配
abb 不匹配
abbb 匹配
繼續(xù)從下一個(gè)位置開(kāi)始讀入第一個(gè)匹配字符
a 不匹配
aa 不匹配

不匹配
aabbb匹配
一直進(jìn)行到最后,所以得到的結(jié)果為abbb,aabbb,
aaabbb,234abbb
3 支配
支配就是對(duì)整個(gè)字符串進(jìn)行一次匹配,匹配之后返回
舉個(gè)例子,字符串為bbb,正則表達(dá)式為[b]*+,這是一個(gè)貪婪的匹配,直接返回bbb
但是這里有個(gè)要注意的地方:如果正則為[b]*+b,返回結(jié)果是false,是空
所以雖然[b]*+匹配了,但是當(dāng)再多了一個(gè)b的時(shí)候,有不滿(mǎn)足要求了,因?yàn)樗麄兪侨制ヅ涞?/span>