在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 正則表達(dá)式 貪婪匹配

正則表達(dá)式 貪婪匹配

在學(xué)習(xí)正則表達(dá)式的貪婪匹配時(shí)有個(gè)疑問。以下面的例子來說,

用 a.*?b 匹配 abaab 得到的結(jié)果是 ab和aab。

如果說是盡可能少地匹配a和b之間的字符,不應(yīng)該是匹配 ab和ab嗎?正則表達(dá)式匹配字符串的時(shí)候,應(yīng)該是從左到右的匹配吧?
那下面這個(gè)例子,

用a*?b(注意,沒有.符號(hào)) 匹配 abacb
如果按照上面那樣匹配的話,應(yīng)該是得到 ab 和 acb吧,但是結(jié)果是 ab 和 b。

搞不太懂,請(qǐng)大神指點(diǎn)指點(diǎn)。感激不盡!

回答
編輯回答
互擼娃

這是因?yàn)檎齽t表達(dá)式是從左至右回溯匹配的(可能不準(zhǔn)確,因?yàn)槭欠窕厮菔菂^(qū)分DFA引擎與NFA引擎的指標(biāo))。

所以正則從左至右匹配,一個(gè)個(gè)比對(duì),直到找到最短匹配的結(jié)果,就把結(jié)果摘出,進(jìn)行下一次匹配。所以你的第一個(gè)正則其實(shí)是這么匹配的:

從左至右匹配,第一個(gè)滿足a.*?b的最短匹配自然是ab,然后ab被摘出,繼續(xù)向后匹配,于是得到第二匹配結(jié)果aab。

第二個(gè)正則純粹是你對(duì)*的意思理解錯(cuò)了,代表前面字符重復(fù)任意次,所以a*?b的最短匹配理應(yīng)是a重復(fù)0次,b重復(fù)1次,于是匹配到最后一個(gè)b

有關(guān)正則的回溯匹配詳解,可以參考: https://zhuanlan.zhihu.com/p/...

2018年8月23日 01:52