分组

什么是分组

正则支持将多个元字符组成一个整体,用于复用,这样的一个整体被成为分组。

分组在正则表达式中的表现方式是括号 ()。被括号括起来的部分“子表达式”会被保存成一个子组。

分组和编号

那分组和编号的规则是怎样的呢?其实很简单,用一句话来说就是,第几个括号就是第几个分组。这么说可能不好理解,举一个例子看一下。

这里有个时间格式 2020-05-10 20:23:05。假设我们想要使用正则提取出里面的日期和时间。


可以写出如图所示的正则,将日期和时间都括号括起来。这个正则中一共有两个分组,日期是第 1 个,时间是第 2 个。

不保存分组

在括号里面的会保存成子组,但有些情况下,你可能只想用括号将某些部分看成一个整体,后续不用再用它,类似这种情况,在实际使用时,是没必要保存子组的。这时我们可以在括号里面使用 ?: 不保存子组。

如果正则中出现了括号,那么我们就认为,这个子表达式在后续可能会再次被引用,所以不保存子组可以提高正则的性能。除此之外呢,这么做还有一些好处,由于子组变少了,正则性能会更好,在子组计数时也更不容易出错。

那到底啥是不保存子组呢?我们可以理解成,括号只用于归组,把某个部分当成“单个元素”,不分配编号,后面不会再进行这部分的引用。

括号嵌套

前面讲完了子组和编号,但有些情况会比较复杂,比如在括号嵌套的情况里,我们要看某个括号里面的内容是第几个分组怎么办?

其实方法很简单,我们只需要数左括号(开括号)是第几个,就可以确定是第几个子组。

假设时间格式是 2020-05-10 20:23:05 。

在上图的正则表达式中,日期分组编号是 1,时间分组编号是 5,年月日对应的分组编号分别是 2,3,4,时分秒的分组编号分别是 6,7,8。

分组引用

在知道了分组引用的编号 (number)后,大部分情况下,我们就可以使用 “反斜扛 + 编号”,即 \number 的方式来进行引用,而 JavaScript 中是通过$编号来引用,如$1。

引用在替换中起到很大作用,假设时间格式是 2020-05-10 20:23:05 。

然后编写正则表达式匹配到具体数值:

1
(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})

然后在替换一栏填上以下正则表达式:

1
年份:\1 月份:\2 日:\3 小时:\4 分:\5 秒:\6

通过分组引用的方式,将查找一栏的正则表达式的分组复用,实现替换的效果,替换后:

1
年份:2020 月份:05 日:10 小时:20 分:23 秒:05

分组
https://sunshinechen.cn/2022/12/16/分组/
作者
sunshine
发布于
2022年12月16日
许可协议