乐趣区

三分钟搞懂正则之捕获

正则基础知识

元字符

如果把正则看做一门语言,那么元字符就是其最基本的语法,只有熟练掌握了元字符,才能敲开正则的大门。熟悉的同学可以跳过这一部分。
常用的元字符有一下这些:

  • 表示位置的:^ &,分别表示开头和结尾
  • 表示字符的:\w,也即[a-zA-Z0-9_]
  • 表示数字的:\d, 也即[0-9]
  • 表示边界的:\b,要注意的是它仅对数字和英文字母有效,比如 /a\b/ 匹配 'ba' 中的 a
  • 表示空白符:\s
  • 表示数量的:可以用通配符,也可以用 {n,m} 的形式。比如* 和{0,}, ? 和{0,1} , + 和{1,}

还有一种特殊的元字符,叫字符集
[],[^] 分别代表正向字符集和反向字符集,分别表示匹配(不匹配)其中任意一个字符。反向字符集中的 ^ 必须在开头哦。
另外要注意的是,元字符在字符集都可都是普通字符,字符集中也有元字符 -,表示范围连接。[a-b] 无法匹配 '-' 哦。
字符集里面还可以表示 unicode 字符,比如常见的汉字的正则表达式 \u4e00-\u9fa5, 这个范围就代表 unicode 字符集中 CJK 统一表意符中的一部分,String.fromCharCode(parseInt('4e00',16)) 可以得到'一'

捕获

首先我们来看下面这张图片,加不加 () 对结果有何影响。

我们可以看到,没有括号,返回的结果里就少了一个东西。那么返回的数组的第二位表示啥呢?我们可以参阅 MDN 中的解释。

翻译成白话,就是数组中的第一个值表示匹配中的字符串,第二个往后,就是捕获到的匹配项。也就是说我加了 (),正则就可以捕获到其中的匹配项。input,index 很好理解,那 groups 有事啥呢?为啥一直没见过它里面有值。
好的,我们再来看下一张图

这个正则的写法叫命名捕获组,它捕获的内容就会在 groups 中也存一份。

那么如何理解捕获呢?我们只要理解主语,宾语,如何获取,捕获顺序就行了。
主语自然是正则,宾语就是括号中的匹配项。
正则捕获后我们可以使用 RegExp.$1 获取捕获的第一个内容,$2 表示捕获的第二个内容,以此类推,也可以从 match,exec 等 js 方法返回值中获取
那么捕获顺序如何确定呢,我们可以再看下一张图:

很显然,它是从外往内,从左往右的一个顺序捕获的。

既然有捕获,那也一定有非捕获。()还有一种功能就是将其中的多个匹配项看成一个整体。那么如果我只想捕获这个整体中的一部分呢?

一图胜千言,当我们不需要捕获时,就可以使用 (?:) 这种写法了。

以上就是捕获的基本用法,不过还有个具名捕获组需要掌握。

  • 命名:?<name>
  • 获取:除了用 groups 对象,我们还可以在 replace 方法中使用 $<name> 获取

  • 另外还需要掌握它的反向引用:\k<name>

那么反向引用是什么意思呢?我们下一期再继续。

退出移动版