(?:pattern)與(?=pattern)的區別

官方定義

(?:pattern)

匹配 pattern 但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供之後使用。這在使用 "或" 字符 (|) 來組合一個模式的各個部分是頗有用。例如, 'industr(?:y|ies) 就是一個比 'industry|industries' 更簡略的表達式。指針

(?=pattern)

正向確定預查(look ahead positive assert),在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不須要獲取供之後使用。例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配以後當即開始下一次匹配的搜索,而不是從包含預查的字符以後開始。code

(?!pattern)

正向否認預查(negative assert),在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不須要獲取供之後使用。例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配以後當即開始下一次匹配的搜索,而不是從包含預查的字符以後開始。blog

(?<=pattern)

反向(look behind)確定預查,與正向確定預查相似,只是方向相反。例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。字符串

(?<!pattern)

反向否認預查,與正向否認預查相似,只是方向相反。例如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。it

共同點

(?:pattern) 與 (?=pattern)都匹配pattern,但不會把pattern結果放到Matches的集合中。搜索

區別

  • (?:pattern) 匹配獲得的結果包含pattern。
  • (?=pattern) 則不包含。

對字符串:"industry abc"的匹配結果:im

  • industr(?:y|ies) ---> "industry"
  • industr(?=y|ies) ---> "industr"

是否消耗字符

  • (?:pattern) 消耗字符,下一字符匹配會從已匹配後的位置開始。
  • (?=pattern) 不消耗字符,下一字符匹配會從預查以前的位置開始。

即後者只預查,不移動匹配指針。如:img

相關文章
相關標籤/搜索