如何使用正则表达式的捕获组与非捕获组?
2017-03-31 本文已影响1259人
cpu_driver
网上有很多类似的文章,我为什么还要写呢?是因为我在阅读Vue2.0的代码中发现了
/^\s*([^\s"'<>\/=]+)(?:\s*((?:=))\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
用别人写的文章去套用的话解释不清,因此我特把此次的正则表达式的学习过程记录下来,以方便后来者能够很快的找到解决问题的答案 。
1. 基本定义
什么是捕获组?
捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。一般一个小括号括起来就是一个捕获组。捕获组可以进行嵌套。以深度优先进行编号,在js中编号从1开始。
例如:
var reg=/(2(3)4)(5(6)7)/;
console.log(
"234567".match(reg)
)
![](https://img.haomeiwen.com/i2137088/4d682b26453f2e05.png)
我们可以看到上图中打印的数组,编号如下图:
![](https://img.haomeiwen.com/i2137088/ef80737bb4b91838.png)
非捕获组是什么呢?
我的理解是参与匹配却不进行分组编号的捕获组,其形式为(?:exp)组成,还有其他的形式,在此不再描述。
例如:
var reg=/1(?:2)/;
console.log(
"12".match(reg)
)
![](https://img.haomeiwen.com/i2137088/63ca2bf9b20af558.png)
由此我们发现非捕获数组进行匹配,但不进行捕获。
2.特殊用法
A. 形如(?:())
非捕获数组不参与编号分配但参与匹配
非捕获数组不参与编号分配但参与匹配
非捕获数组不参与编号分配但参与匹配
其分组如下:
![](https://img.haomeiwen.com/i2137088/f8da4afa99ad2028.png)
也就是说exp中按照正常的分组逻辑进行分组
![](https://img.haomeiwen.com/i2137088/8fb489fc2ed962fa.png)
B. 形如(?:()|())
严格说这样写是解决选择缓存问题的写法(直接用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。)
其编号为:
![](https://img.haomeiwen.com/i2137088/27da5f3327ca984a.png)
C.形如 ((?:exp))
非捕获数组不参与编号分配但参与匹配
这种写法我认为等价于(exp)
其分组情况为
![](https://img.haomeiwen.com/i2137088/d7693ebf7cfd5787.png)
因此文章开头提到的表达式:
![](https://img.haomeiwen.com/i2137088/d67eb9caec38c388.png)
生成这张图的地址为:链接