上1篇文章《編程思想之正則表達式 》中講了正則表達式的原理、使用方法和常見的正則表達式總結,本文將進1步探討Java正則表達中Greedy、Reluctant、Possessive3種策略的區分。
從Java的官方文檔http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html中我們可以看到,正則表達式表示數量詞的符號有3套,分別是Greedy(貪婪的)、Reluctant(委曲的)和Possessive(獨占的)。其含義以下:
Greedy 數量詞 | |
X? | X,1次或1次也沒有 |
X* | X,零次或屢次 |
X+ | X,1次或屢次 |
X{n} | X,恰好 n 次 |
X{n,} | X,最少 n 次 |
X{n,m} | X,最少 n 次,但是不超過 m 次 |
|
|
Reluctant 數量詞 | |
X?? | X,1次或1次也沒有 |
X*? | X,零次或屢次 |
X+? | X,1次或屢次 |
X{n}? | X,恰好 n 次 |
X{n,}? | X,最少 n 次 |
X{n,m}? | X,最少 n 次,但是不超過 m 次 |
|
|
Possessive 數量詞 | |
X?+ | X,1次或1次也沒有 |
X*+ | X,零次或屢次 |
X++ | X,1次或屢次 |
X{n}+ | X,恰好 n 次 |
X{n,}+ | X,最少 n 次 |
X{n,m}+ | X,最少 n 次,但是不超過 m 次 |
看上面的表格我們發現這3種數量詞的含義都相同(如X?、X??、X?+都表示1次或1次也沒有),但他們之間還是有1些細微的區分的。我們先來看1個例子:
matched form 0 to 13
matched form 0 to 4
matched form 4 to 13
//未匹配成功
Greedy數量詞被稱為“貪婪的”是由于匹配器被強迫要求第1次嘗試匹配時讀入全部輸入串,如果第1次嘗試匹配失敗,則從后往前逐一字符地回退并嘗試再次匹配,直到匹配成功或沒有字符可回退。
模式串:.*foo
查找串:xfooxxxxxxfoo
結果:matched form 0 to 13
其比較進程以下
Reluctant采取與Greedy相反的方法,它從輸入串的首(字符)位置開始,在1次嘗試匹配查找中只委曲地讀1個字符,直到嘗試完全個字符串。
模式串:.*foo
查找串:xfooxxxxxxfoo
結果:matched form 0 to 4
matched form 4 to 13
其比較進程以下
Possessive數量詞總是讀入全部輸入串,嘗試1次(僅且1次)匹配成功,不像Greedy,Possessive從不回退,即使這樣做也可能使整體匹配成功。
模式串:.*foo
查找串:xfooxxxxxxfoo
結果:
//未匹配成功
其比較進程以下
參考文章:http://docs.oracle.com/javase/tutorial/essential/regex/quant.html
再來看看幾個例子:
模式串:.+[0⑼]
查找串:abcd5aabb6
結果:matched form 0 to 10
模式串:.+?[0⑼]
查找串:abcd5aabb6
結果:matched form 0 to 4
模式串:.{1,9}+[0⑼]
查找串:abcd5aabb6
結果:matched form 0 to 10
模式串:.{1,10}+[0⑼]
查找串:abcd5aabb6
結果:匹配失敗
如果您有甚么疑惑和想法,請在評論處給予反饋,您的反饋就是最好的測評師!由于本人技術和能力有限,如果本博文有毛病或不足的地方,敬請體諒并給出您寶貴的建議!
========================歡迎關注編程思想系列文章========================
編程思想之正則表達式
編程思想之迭代器
編程思想之遞歸
編程思想之回調
上一篇 騰訊微博小清新客戶端
下一篇 搭建一個完全由你主宰的網站(二)