正則表示式-- (?:pattern)與(?=pattern)的區別
阿新 • • 發佈:2018-11-04
正則表示式-- (?:pattern)與(?=pattern)的區別
2018年04月20日 13:48:44 shashagcsdn 閱讀數:115 標籤: 正則表示式 非獲取匹配 更多
個人分類: 學習筆記
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/shashagcsdn/article/details/80017678
學習正則表示式時,對(?:pattern)與(?=pattern)的區別做個記錄。
官方定義
(pattern) : 匹配 pattern 並獲取這一匹配,所獲取的匹配可以從產生的 Matches 集合得到。
(?:pattern) :匹配 pattern 但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行儲存供以後使用。
(?=pattern) :正向預查,在任何匹配 pattern 的字串開始處匹配查詢字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始。
共同點
(?:pattern)
與 (?=pattern)
都匹配pattern,但不會把pattern結果放到Matches的集合中。
區別
(?:pattern)
匹配得到的結果包含pattern,(?=pattern)
則不包含。如:
對字串:"industry abc"的匹配結果:
industr(?:y|ies) ---> "industry"
industr(?=y|ies) ---> "industr"
- 1
- 2
- 3
- 是否消耗字元
(?:pattern)
消耗字元,下一字元匹配會從已匹配後的位置開始。(?=pattern)
即後者只預查,不移動匹配指標。如:
注:示例中的位置為易於理解的檢視位置,具體傳動原理可以參照這篇文章 正則基礎之——NFA引擎匹配原理 (感謝這個作者的分析)。