对于编程来说空号的作用往往就是用来分组的,比如说在写一些比较长的条件判断的时候经常会用到,我们一起来看一下正则表达式中的括号()
的作用吧。
01. 分组
看一下下图中(1)中的正则,我们匹配连续3次出现的字符b,那如果我们的变换一下,比如说我们待匹配的字符串为:abcabcdabcde
,我们要匹配连续的abc
要怎么办呢?这里我们就需要用到本篇要说到的括号了,请看下图中(2)的正则:
02. 分支结构
使用括号标记的子表达式同样提供了多选的支持即通过管道符来实现,在上图(2)中的两行字符的区别就是第一行为2组连续的abc,第二行为3组连续的abc,我们通过增加一个分组的形式来讲第一行进行匹配:
03. 使用分组提取/替换数据
这里我们沿用正则表达式迷你书v1.1版的案例(日期)相关,如常见的日期格式通常是yyyy-mm-dd,我们用正则表示一下,请看下图:
我们接着来增加括号准备提取数据,请接着看图,图片较大请按第四象限和下图(2)的可视化图:
我们接着用代码来演示一下提取结果:
我们再借助Js的replace函数来替换成yyyy/mm/dd
的形式:
04. 反向引用
这里的反向引用指的是我们可以通过标识来引用正则之前出现过的分组,所以称之为反向引用。
下图中的正则可以正确命中字符串2021-10-31 12:20:30
和2021/10/31 12:20:30
,但是有点意外的是2021-10/31 12:20:30
这样的字符串照样能被命中,我们要怎么样才能使得前后年月和月天之间的符号保持一致呢?这里就用到了我们这小节的反向引用。
加入反向引用:
注意:切记是和前面引用内容一致的哦,比如说:\d{4}(-|\/)\d{2}\1\d{2}[\s]{1}\d{2}(:)\d{2}\2\d{2}
。还要如果不能搞清楚分组情况的话可以通过可视化页面来辅助分析一下。 如果匹配的分组不存在,那么只会匹配反向引用的字符本身。
05. 非捕获情况
即不在API里面引用,也不在正则里反向引用的话我们就需要使用到非捕获括号(?:p)
和(?:p|p|p)
。
可以看到我们原来的分组2变成了分组1,而原来的分组1变成了原始的括号的作用。
欢迎关注我的公众号“前端小鑫同学”,原创技术文章第一时间推送。
括号分组我们就先学到这,赶紧抄起以前代码中的正则用下面的工具试试看吧,XDM🤭。以上内容学习自老姚的正则表达式迷你书v1.1版,因部分内容还没能理解,还请阅读原著多多学习。