正則表達式之前瞻后顧,貪婪 與非貪婪

一、 前瞻后顧

1. 含義

表達式 含義 常用實例
非捕獲組 (?:pattern) 匹配pattern但不獲取匹配結(jié)果,也就是說這是一個非獲取匹配,不進行存儲供以后使用。這在使用或字符“(|)”來組合一個模式的各個部分是很有用。例如"industr(?:y|ies)"就是一個比“industry|industries" 更簡潔的表達式
前瞻 肯定式向前查找 (?=pattern) 正向肯定預查,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如,"Windows(?=95|98|NT|200)"能匹配"Windows2000”中的“Windows",但不能匹配"Windows3.1" 中的"Windows"。預查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始
負前瞻 否定式向前查找 (?!pattern) 正向否定預查,在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如“Windows(?!95|98|NT|2000)"能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows” ^(?!str)不以某字符串開頭
/^(?!test).*/
后顧 肯定式向后查找 (?<=pattern) 反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows"能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”
負后顧 否定式向后查找 (?<!pattern) 反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。 (?<!str)$ 不以某字符串結(jié)尾 /.*(?<!end)$/

2. ?: 與?= 區(qū)別

  1. 共同點

    (?:pattern)(?=pattern)都匹配pattern,但不會把pattern結(jié)果放到Matches的集合中

  2. 區(qū)別

    • (?:pattern) 匹配得到的結(jié)果包含pattern,(?=pattern) 則不包含。如:

      \\ 對于字符串 " industry abc"
      industr(?:y|ies) => industry
      industr(?=y|ies) => industr

      const str = "industry abc"
      const reg = /industr(?:y|ies)/
      const reg1 = /industr(?=y|ies)/
      
      console.log(str.match(reg))
      console.log(str.match(reg1))
      
匹配結(jié)果.png
  • 是否消耗字符

    (?:pattern) 消耗字符,下一字符匹配會從已匹配后的位置開始。
    (?=pattern) 不消耗字符,下一字符匹配會從預查之前的位置開始。
    即后者只預查,不移動匹配指針。如:

匹配過程.png

3. 常用例子

正則表達式 含義
(?<=").*?(?=") 匹配引號中間的值

二、貪婪模式與非貪婪模式

含義

  • 貪婪與非貪婪模式影響的是\color{red}{被量詞修飾的子表達式}的匹配行為.
  • 貪婪模式在\color{red}{整個表達式匹配成功}的前提下,盡可能\color{red}{多}的匹配.
  • 而非貪婪模式在\color{red}{整個表達式匹配成功}的前提下,盡可能\color{red}{少}的匹配.
貪婪模式量詞 非貪婪模式量詞(懶惰模式或惰性模式)
{m,n} {m,n}?
{m,} {m,}?
? ??
* *?
+ +?

示例

源字符串 正則表達式 匹配結(jié)果
aa<div>test1</div>bb<div>test2</div>cc <div>.*</div> <div>test1</div>bb<div>test2</div>
<div>.*?</div> <div>test1</div>
<div>.*</div>bb <div>test1</div>bb
<div>.*?</div>cc <div>test1</div>bb<div>test2</div>cc

三、參考

正則表達式-- (?:pattern)與(?=pattern)的區(qū)別
正則基礎之——NFA引擎匹配原理
正則表達式 - 字符匹配不以某字段開頭或者結(jié)尾
正則基礎之——貪婪與非貪婪模式
深入理解正則表達式環(huán)視的概念與用法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容