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