javascript正则表达式中分组详解
之前写了一篇关于正则新手入门的文章,本以为对正则表达式相对比较了解但是今天我又遇到了一个坑,可能是自己不够细心的原因吧,今天就着重和大家分享一下javascript正则表达式中的分组。如果你对JS正则表达式不够理解可以点击这里了解更多。
分组在正则中用的还是比较广的,我所理解的分组就是一对括号(),每一对括号就代表了一个分组,
分组可以分为:
- 捕获性分组
- 非捕获性分组
- 捕获性分组
捕获性分组会在比如matchexec这样的函数中以第二项,第三项的形式得到相应分组的结果。先来看一个例子吧
varreg=/test(\d+)/; varstr='newtest001test002'; console.log(str.match(reg)); //["test001","001",index:4,input:"newtest001test002"]
代码中(\d+)是一个分组(有些人也叫他子模式),但是表示的都是同一个意思,上面的例子中test001是完全匹配的结果,
然而分组的匹配是从整个完全匹配结果(也就是test001)中来查找与子模式\d+匹配的字符,这里显然是001.
但是今天遇到的情况是这样的
varreg=/test(\d)+/; varstr='newtest001test002'; console.log(str.match(reg)); //["test001","1",index:4,input:"newtest001test002"]
不同之处就是(\d+)改为了(\d)+,整个匹配结果还是test001但是第一个分组匹配的结果却不同。
咱们慢慢来分析他们的区别
(\d+)这整个是一个分组的情况,由于默认情况下匹配模式都是贪婪模式也就是说尽可能多的去匹配
所有\d+匹配到的结果是001然后外面添加了一对括号也就是一个分组,这样第一个分组中匹配的结果就是001.
再来看第二个例子中的(\d)+同样这也是一个贪婪模式首先会先匹配0然后后面是0也会匹配到最后是1同样也匹配到到此匹配结束
看起来跟第一个例子中的匹配没什么区别,但是这里的分组(\d)表示匹配单个数字,
按照我之前的理解是会匹配最开始匹配到的结果也就是0但这种理解是错误的。由于整个匹配是贪婪模式,尽可能多的去匹配
分组中的(\d)就会捕获最后一次匹配到的结果1
如果是非贪婪模式那就会尽可能少的去匹配
varreg=/test(\d)+?/; varstr='newtest001test002'; console.log(str.match(reg)); //["test001","0",index:4,input:"newtest001test002"]
这样(\d)匹配结果就是0了,虽然后面还有能够匹配到的结果,但是这里是尽可能少的去匹配
非捕获性分组
varreg=/test(?:\d)+/; varstr='newtest001test002'; console.log(str.match(reg)); //["test001",index:4,input:"newtest001test002"]
非捕获性分组也就是有些地方需要用到一对括号,但是又不想让他成为一个捕获性分组也就是不想让这个分组被类似macthexec这样的函数所获取到
通常在括号内部的前面加上?:也就是(?:pattern)这样就变成了一个非捕获性分组,
这样match的结果中就不会出现分组匹配到的内容了也就是少了第二项的1.
这篇文章着重说明(\d+)和(\d)+的区别,也是我今天踩到的坑,若有错误之处,欢迎指正。