假設存在匹配示例:匹配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源字串:
正規表示式:
(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)才是符合需求的。
正規表示式運算子優先順序
正規表示式從左到右進行計算,並遵循優先順序順序,這與算術表示式非常類似。相同優先順序的從左到右進行運算,不同優先順序的運算先高後低。下表從最高到最低說明了各種正規表示式運算子的優先順序順序 運算子描述 轉義符 圓括號和方括號 限定符 任何元字元 任何字元 定位點和序列 即 位置和順序 替換,或 操作...
正規表示式(3) 運算子優先順序
正規表示式 1 語法講解 正規表示式 2 匹配規則 上一節,對於正則的表示式的匹配規則做了相應的講解。對於閱讀正規表示式有了很好的提公升。但是,與一般語言運算子相對比,正規表示式的運算子也是相當多,那麼如何分辨他們的優先順序。這裡我們貼出乙個非常複雜的模式 w w w w w w w w 本表示式功...
正規表示式學習 優先順序順序,特殊字元,限定符
下表從最高到最低說明了各種正規表示式運算子的優先順序順序 運算子 說明 轉義符括號和中括號 限定符 任何元字元 任何字元 定位點和序列 替換 字元具有高於替換運算子的優先順序,使得 m food 匹配 m 或 food 若要匹配 mood 或 food 請使用括號建立子表示式,從而產生 m f oo...