javascriptRegex中 (?=exp)、(?<=exp)、(?!exp)

來源:互聯網
上載者:User

標籤:個數   三次   擷取   數組   mat   包含   測試   strong   開始   

 (?=exp)

百度百科給的解釋:非擷取匹配,正向肯定預查,在任何匹配pattern的字串開始處匹配尋找字串,該匹配不需要擷取供以後使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始。

只看這個,看一輩子恐怕也看不明白。

我們看個案例:

 console.log((‘123456789.56‘).match(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g)); //結果: ["123", "456"]

解釋:

首先要滿足 : \d{1,3}這個正則。

第 1 步: 開始的 1 滿足\d{1,3}最大匹配,後面的 23456789.56 不滿足 (?=(\d{3})+(\.\d*)?$),所以這個 “1” 不滿足。

第 2 步:開始的 12 滿足 \d{1,3}最大匹配,後面的 3456789.56 不滿足 (?=(\d{3})+(\.\d*)?$),所以這個 “12” 不滿足。

第 3 步:開始的 123 滿足 \d{1,3}最大匹配,後面的 456789.56 滿足 (?=(\d{3})+(\.\d*)?$),所以這個  “123” 滿足,返回  “123”

第 4 步: 從4開始搜尋,開始的 4 滿足\d{1,3}最大匹配,後面的 56789.56 不滿足 (?=(\d{3})+(\.\d*)?$),所以這個 “4 ”不滿足。

第 5 步: 從5開始搜尋,開始的 45 滿足\d{1,3}最大匹配,後面的 6789.56 不滿足 (?=(\d{3})+(\.\d*)?$),所以這個 “45“ 不滿足。

第 6 步: 從6開始搜尋,開始的 456 滿足\d{1,3}最大匹配,後面的 789.56 滿足 (?=(\d{3})+(\.\d*)?$),所以這個 “456“ 滿足,返回 “456”

第 7 步: 從7開始搜尋,開始的 7 滿足\d{1,3}最大匹配,後面的 89.56 不滿足 (?=(\d{3})+(\.\d*)?$),所以這個 “7“ 不滿足。

第 8 步: 從8開始搜尋,開始的 78 滿足\d{1,3}最大匹配,後面的 9.56 不滿足 (?=(\d{3})+(\.\d*)?$),所以這個 “78“ 不滿足。

第 9 步: 從9開始搜尋,開始的 789 滿足\d{1,3}最大匹配,後面的 .56 不滿足 (?=(\d{3})+(\.\d*)?$),所以這個 “789“ 不滿足,此時“789”滿足了 \d{1,3}最大的匹配,但是後面沒有能匹配的。

第 10 步: 從 . 開始搜尋,開始的 .(.|9. | 89. )都不滿足\d{1,3},所以這個 從 . 位置搜尋的沒滿足的。

第 11 步 : 從 5 開始搜尋,開始的 5 滿足 \d{1,3}最大匹配,後面的6 不滿足  (?=(\d{3})+(\.\d*)?$),所以這個 “5“ 不滿足。

第 12 步 : 從 6 開始搜尋,開始的 56 滿足 \d{1,3}最大匹配,後面就沒有了,不滿足   (?=(\d{3})+(\.\d*)?$),  所以這個 “56 “ 不滿足。

說的直接點就是: (?=exp) 裡面匹配的內容是不會被 match捕獲的,只是當個條件來對待使用,只是用來判斷當前檢索的位置後面的能否滿足這個條件。

 (?<=exp)

     也叫零寬度正回顧後發斷言,它斷言自身出現的位置的前面能匹配運算式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re以外的部分),例如在尋找reading a book時,它匹配ading。

有點奇怪,在js 的Regex中來測試這個一直報錯,猜測估計是不支援。

(?!exp)

 這個與  (?=exp) 相反.

 

console.log((‘123456789.56‘).match(/\d{1,3}(?!(\d{3})+(\.\d*)?$)/g));//["12", "345", "678", "9", "56"]

 

解釋:

首先的滿足 \d{1,3}

從 1 處開始搜尋,\d{1,3}的最大匹配是 1,後面是 23456789.56  ,滿足, (?!(d{3}) +(\.\d*)?$), OK, 此時 \d{1,3} 匹配的是 “1”

第二次從 2 開始搜尋,,\d{1,3}的最大匹配是 12, 後面是 3456789.56  ,滿足, (?!(d{3}) +(\.\d*)?$), OK, 此時 \d{1,3} 匹配的是 “12”

第三次從 3 開始搜尋,\d{1,3}的最大匹配是 123,後面是 456789.56  ,不滿足, (?!(d{3}) +(\.\d*)?$),所以返回的結果數組中第一個是 “12”., 此時 \d{1,3} 匹配的最大是是 “12”

第四次從 4 開始搜尋, 後面是 56789.56 ,\d{1,3}的最大匹配是 34,滿足, (?!(d{3}) +(\.\d*)?$), OK,  此時 \d{1,3} 匹配的是 “34”

第五次從 5 開始搜尋, 後面是 6789.56  ,\d{1,3}的最大匹配是 345,滿足, (?!(d{3}) +(\.\d*)?$), OK,  此時 \d{1,3} 匹配的是 “345”.,已經滿足最大3個數字了,此時返回 “345”

第六次從 6 開始搜尋, 後面是 789.56  ,\d{1,3}的最大匹配是 6,不滿足, (?!(d{3}) +(\.\d*)?$),  此時 \d{1,3} 匹配的是 “6”.

第七次從 7 開始搜尋, 後面是 89.56  ,\d{1,3}的最大匹配是 67,滿足, (?!(d{3}) +(\.\d*)?$),  此時 \d{1,3} 匹配的是 “67”.

 第八次從 8 開始搜尋, 後面是 9.56  ,\d{1,3}的最大匹配是 678,滿足, (?!(d{3}) +(\.\d*)?$),  此時 \d{1,3} 匹配的是 “678”.,已經滿足最大3個數字了,此時返回 “678”.

 第九次從 9 開始搜尋, 後面是 .56  ,\d{1,3}的最大匹配是 9,滿足, (?!(d{3}) +(\.\d*)?$),  此時 \d{1,3} 匹配的是 “9”

 第十次從 .  開始搜尋, 此時 “9.” 不滿足 \d{1,3} ,所以此時返回 “9”

 第十一次從 5 開始搜尋, 後面是 6  ,\d{1,3}的最大匹配是 6,滿足, (?!(d{3}) +(\.\d*)?$),  此時 \d{1,3} 最大匹配的是 “5”

 第十二次從 6 開始搜尋, 後面沒有 ,\d{1,3}的最大匹配是 56,滿足, (?!(d{3}) +(\.\d*)?$),  此時 \d{1,3} 最大匹配的是 “56”,結束,返回最後一個 “56”

 

 

這隻是個人的理解,有不對之處,望各位大神們指正。

javascriptRegex中 (?=exp)、(?<=exp)、(?!exp)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.