首頁 > web前端 > js教程 > 主體

深入理解JS正規表示式---分組

高洛峰
發布: 2017-01-20 13:45:23
原創
968 人瀏覽過

深入理解JS正規表示式---分組

之前寫了一篇關於正則新手入門的文章,本以為對正則表達式相對比較了解但是今天我又遇到了一個坑,可能是自己不夠細心的原因吧,今天就著重跟大家分享一下javascript正規表示式中的分組。如果你對JS正規表示式不夠理解 可以點擊這裡了解更多。

分組在正規中用的還是比較廣的,我所理解的分組就是一對括號() ,每一對括號就代表了一個分組,分組可以分為:

•捕獲性分組
•非捕獲性分組

捕獲性分組

捕獲性分組會在像match exec這樣的函數中以第二項,第三項的形式得到對應分組的結果。先來看一個例子吧

var reg = /test(\d+)/;
 var str = 'new test001 test002';
 console.log(str.match(reg));//["test001", "001", index: 4, input: "new test001 test002"]
登入後複製

程式碼中(d+)是一個分組(有些人也叫他子模式),但是表示的都是同一個意思,上面的例子中test001是完全匹配的結果,然而分組的匹配是從整個完全匹配結果(也就是test001)中來查找與子模式d+匹配的字符,這裡顯然是001.但是今天遇到的情況是這樣的

var reg = /test(\d)+/;
 var str = 'new test001 test002';
 console.log(str.match(reg));//["test001", "1", index: 4, input: "new test001 test002"]
登入後複製

不同之處就是(d+ ) 改為了(d)+ ,整個配對結果還是test001 但是第一個分組匹配的結果卻不同。咱們慢慢來分析他們的區別

(d+) 這整個是一個分組的情況,由於默認情況下匹配模式都是貪婪模式也就是說盡可能多的去匹配所有d+ 匹配到的結果是001 然後外面增加了一對括號也就是一個分組,這樣第一個分組中匹配的結果就是001.再來看第二個例子中的(d)+ 同樣這也是一個貪婪模式首先會先匹配0然後後面是0 也會匹配到最後是1 同樣也匹配到到此匹配結束看起來跟第一個例子中的匹配沒什麼區別,但是這裡的分組(d)表示匹配單個數字,按照我之前的理解是0 但這種理解是錯誤的。由於整個匹配是貪婪模式,盡可能多的去匹配分組中的(d) 就會捕獲最後一次匹配到的結果1,如果是非貪婪模式那就會盡可能少的去匹配

var reg = /test(\d)+?/;
var str = 'new test001 test002';
console.log(str.match(reg));//["test001", "0", index: 4, input: "new test001 test002"]
登入後複製

這樣( d)配對結果就是0了,雖然後面還有能夠匹配到的結果,但是這裡是盡可能少的去匹配

非捕獲性分組

非捕獲性分組也就是有些地方需要用到一對括號,但是又不想讓他成為一個捕獲性分組也就是不想讓這個分組被類似macth exec 這樣的函數所獲取到通常在括號內部的前面加上?: 也就是(?:pattern)這樣就變成了一個非捕獲性分組,

var reg = /test(?:\d)+/;
 var str = 'new test001 test002';
 console.log(str.match(reg));//["test001", index: 4, input: "new test001 test002"]
登入後複製

這樣match的結果中就不會出現分組匹配到的內容了也就是少了第二項的1.

這篇文章著重說明(d+)和(d)+的差別,也是我今天踩到的坑,若有錯誤之處,歡迎指正。

以上這篇深入理解JS正規表示式---分組就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持PHP中文網。

更多深入理解JS正規表示式---分組相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!