1. 程式人生 > >正則表示式-- (?:pattern)與(?=pattern)的區別

正則表示式-- (?:pattern)與(?=pattern)的區別

正則表示式-- (?: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引擎匹配原理 (感謝這個作者的分析)。