国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript正則表達式中分組詳解

2019-11-20 09:28:36
字體:
來源:轉載
供稿:網友

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

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

分組可以分為:

  1. 捕獲性分組
  2. 非捕獲性分組
  3. 捕獲性分組

捕獲性分組會在 比如 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了,雖然后面還有能夠匹配到的結果,但是這里是盡可能少的去匹配

非捕獲性分組

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

非捕獲性分組也就是 有些地方需要用到一對括號,但是又不想讓他成為一個捕獲性分組也就是不想讓這個分組被類似 macth exec 這樣的函數所獲取到

通常在括號內部的前面加上?: 也就是 (?:pattern)這樣就變成了一個非捕獲性分組,

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中方县| 赞皇县| 丰顺县| 始兴县| 蓬莱市| 马鞍山市| 河东区| 成都市| 福贡县| 高台县| 宣武区| 梁平县| 克什克腾旗| 开江县| 东阿县| 麦盖提县| 项城市| 麻江县| 本溪市| 延庆县| 文安县| 股票| 寿光市| 杭州市| 抚顺县| 大安市| 土默特左旗| 长沙市| 遵义县| 桂林市| 万安县| 康保县| 潜江市| 通渭县| 山西省| 晋江市| 神农架林区| 中卫市| 乐至县| 交城县| 铜梁县|