Java正則之貪婪匹配、惰性匹配
貪婪量詞:
先看整個字符串是不是一個匹配。如果沒有發(fā)現(xiàn)匹配,它去掉最后字符串中的最后一個字符,并再次嘗試。如果還是沒有發(fā)現(xiàn)匹配,那么 再次去掉最后一個字符串,這個過程會一直重復直到發(fā)現(xiàn)一個匹配或者字符串不剩任何字符。簡單量詞都是貪婪量詞。
惰性量詞:
先看字符串中的第一個字母是不是一個匹配,如果單獨著一個字符還不夠,就讀入下一個字符,組成兩個字符的字符串。如果還沒有發(fā)現(xiàn)匹配,惰性量詞繼續(xù)從字符串中添加字符直到發(fā)現(xiàn)一個匹配或者整個字符串都檢查過也沒有匹配。惰性量詞和貪婪量詞的工作方式恰好相反。
支配量詞:
只嘗試匹配整個字符串。如果整個字符串不能產(chǎn)生匹配,不做進一步嘗試。
貪婪量詞 惰性量詞 支配量詞 描述
-------------------------------------------------------------------------------------
? ?? ?+ 可以出現(xiàn)0次或1次,但至多出現(xiàn)1次
* *? *+ 可以出現(xiàn)任意次,也可以不出現(xiàn)
+ +? ++ 出現(xiàn)1次或多次,但至少出現(xiàn)1次
{n} {n}? {n}+ 一定出現(xiàn)n次
{n,m} {n,m}? {n,m}+ 至少出現(xiàn)n次,但至多不能超過m次
{n,} {n,}? {n,}+ 可以出現(xiàn)任意次,但至少出現(xiàn)n次
例如:我們要從字符串a(chǎn)bbbaabbbaaabbb1234中獲得abbb,aabbb,aaabbb的匹配
1、貪婪量詞
var regexp = /.*bbb/g;
var a = str.match(regexp);
alert(a.length); //output:1
alert(a[0]); //output:abbbaabbbaaabbb
貪婪量詞的工作過程可以這樣表示:
a)abbbaabbbaaabbb1234
b)abbbaabbbaaabbb123
c)abbbaabbbaaabbb12
d)abbbaabbbaaabbb1
e)abbbaabbbaaabbb //true
可以看到,貪婪量詞在取得一次匹配后就會停止工作,雖然我們加了'g'(全局匹配)
2、惰性量詞
var regexp = /.*?bbb/g;
var a = str.match(regexp);
alert(a.length); //output:3
alert(a[0]); //output:abbb
alert(a[1]); //output:aabbb
alert(a[2]); //output:aaabbb
惰性量詞的工作過程可以這樣表示:
a)a
b)ab
c)abb
d)abbb //保存結(jié)果,并從下一個位置重新開始
e)a
f)aa
g)aab
h)aabb
j)aabbb //保存結(jié)果,并從下一個位置重新開始
e)a
e)aa
e)aaa
e)aaab
e)aaabb
e)aaabbb //保存結(jié)果,并從下一個位置重新開始
由于JS是不支持支配量詞的,所以支配量詞我們只能用JAVA來演示:
String string = "abbbaabbbaaabbb1234";
Pattern p = Pattern.compile(".*+bbb");
Matcher m = p.matcher(string);
System.out.println(m.find()); //output:false
因為支配量詞采用一刀切的匹配方式,如:
a)abbbaabbbaaabbb1234 //false
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡,能夠?qū)Υ蠹沂炀氄莆誮ava正則匹配有所幫助。
請您花一點時間將文章分享給您的朋友或者留下評論。我們將會由衷感謝您的支持!
相關文章
詳解Java編程中final,finalize,finally的區(qū)別
這篇文章主要介紹了詳解Java編程中final,finalize,finally的區(qū)別,這個在Java面試題中簡直是太常見了...需要的朋友可以參考下2015-11-11基于logback實現(xiàn)純java版本的SDK組件
這篇文章主要介紹了基于logback實現(xiàn)純java版本的SDK組件,在項目開發(fā)過程中通常會使用logback作為日志記錄的依賴工具,使用方式是引入logback相關jar包,然后配置logback.xml配置文件的方式來實現(xiàn),需要的朋友可以參考下2023-11-11SpringBoot整合EasyExcel實現(xiàn)導入導出數(shù)據(jù)
這篇文章主要為大家詳細介紹了如何使用Vue、SpringBoot和EasyExcel實現(xiàn)導入導出數(shù)據(jù)功能,感興趣的小伙伴可以跟隨小編一起學習一下2022-05-05