正則表達式的順序優先級


前言

假設存在匹配示例:匹配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)才是符合需求的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM