正则表达式的顺序优先级
前言
假設(shè)存在匹配示例:匹配a-c@或a@
你認(rèn)為正則a|(a-c)(?=\W)與(a-c)|a(?=\W)都能匹配上面的示例嗎?這2個(gè)正則有什么本質(zhì)區(qū)別?哪一個(gè)才是正確的寫法?--這就涉及了正則表達(dá)式的順序優(yōu)先級(jí),本文將解釋這一點(diǎn)。
什么是正則表達(dá)式的順序優(yōu)先級(jí)呢?在正則表達(dá)式中,| 前后的表達(dá)式的順序是有講究的,如expression1|expression2和expression2|expression1匹配的結(jié)果或許存在不同,在編輯正則表達(dá)式時(shí)要有這樣意識(shí),否則編輯出的正則可能不符需求。
?
舉例說(shuō)明
示例1
源字符串:
a-c@ ?
a@
正則表達(dá)式:
a|(a-c)(?=\W)
(a-c)|a(?=\W)
?
匹配結(jié)果:a|(a-c)(?=\W)能夠匹配a@,但不能匹配a-c@;(a-c)|a(?=\W)則都可以匹配。
原因:(a-c)|a(?=\W)先匹配a-c這個(gè)整體,如果匹配失敗則進(jìn)行回溯,嘗試匹配a,所以@前的a-c或a都是可匹配的;a|(a-c)(?=\W)能夠匹配a@自不必說(shuō),但為什么不能匹配a-c@呢?因?yàn)樗?span style="color:#0000ff;">先匹配a,剩下-c@,-匹配(?=\W)成功,整個(gè)正則匹配成功,匹配結(jié)果為:a
?
示例2
源字符串:
1
01
11
正則表達(dá)式:
(0?[123456789]|(1[012]))
((1[012])|0?[123456789])
?
匹配結(jié)果:(0?[123456789]|(1[012]))可匹配1與01,不可匹配11;((1[012])|0?[123456789])可匹配所有的源字符串。
原因:同示例1。
?
小結(jié)
如本文開頭所問,a|(a-c)(?=\W)與(a-c)|a(?=\W)的本質(zhì)區(qū)別--后者的匹配廣度高于前者,所以(a-c)|a(?=\W)才是符合需求的。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wql025/p/5366911.html
總結(jié)
以上是生活随笔為你收集整理的正则表达式的顺序优先级的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程之美计算0到N中包含数字1的个数
- 下一篇: 创建交互式shell脚本对话框