標籤:個數 三次 擷取 數組 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)