ECMAScript 2018 新特性之非捕获组: (?>)

阅读时长 3 分钟读完

在正则表达式中,捕获组是十分重要的概念,它可以将匹配到的部分提取出来。但是有时候我们并不关心某些子表达式的值,只是希望它们能够匹配成功,并且不会干扰到我们需要提取的内容。这时候,非捕获组就派上用场了。本文将详细介绍 ECMAScript 2018 中加入的非捕获组。

什么是非捕获组

非捕获组(Non-capturing group)是一种特殊的匹配模式,可以匹配指定的模式但不进行捕获。在正则表达式中,捕获组用小括号 ( ) 括起来,而非捕获组则是在小括号与 ? 之间加入符号 >, 形如 (?>)

使用非捕获组可以提高正则表达式的效率,因为大多数情况下捕获组的功能并不需要。如果不需要捕获,使用非捕获组可以避免产生一个新的捕获组对象。

非捕获组的语法

非捕获组的语法很简单,只需要在小括号和 ? 之间加入符号 > 即可。

例如,下面是一个使用非捕获组的正则表达式示例:

在上述正则表达式中,(?>\d{3}) 匹配任意的三个数字,但是不会像普通的捕获组一样将其内容提取出来。接着,\d{3}-\d{4} 匹配由一个连字符分隔开的 7 位数字序列。

非捕获组的应用场景

非捕获组可以在一个复杂的正则表达式中帮助我们提高性能,而不需要关心其中某些匹配是否需要被捕获。下面我们来看几个示例,展示非捕获组的应用场景。

示例一:匹配连续的数字

我们希望匹配连续的数字,这个用正则表达式是非常简单的,我们可以使用 \d+ 表达式来匹配,其中 + 表示匹配一次或多次。但是,如果我们需要在某些情况下更精确地匹配,比如我们不希望将三个以上的数字匹配到,可以使用非捕获组 (?>\d{1,2})

上述正则表达式可以匹配以数字开头,数字之间用逗号分隔,以小数点结尾的字符串。其中,(?>\d{3}) 匹配三个连续的数字,并且不会将其内容捕获。

示例二:匹配 HTML 元素

有时候需要从 HTML 标记中提取出所有的元素,但是我们不关心每个元素的样式或者属性。此时,我们可以使用下面的正则表达式:

其中,[^>] 表示匹配任何一个字符,但不包括大于号;.*? 表示匹配任意字符零次或多次,但最小匹配,这里捕获了我们需要的标记内容;<\/[^>]*> 表示匹配 / 和任意的字符,但不包括 >,用于匹配闭合标记。在上述正则表达式中,使用了非捕获组 (?:) 来提高效率,避免了不必要的内容捕获。

总结

本文介绍了 ECMAScript 2018 新特性之非捕获组 (?>),并列举了其在正则表达式中的应用场景。使用非捕获组可以提高效率,避免不必要的内容捕获。在编写复杂的正则表达式时,学会使用非捕获组可以让我们的正则表达式更加精细和高效。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c804f85ad90b6d04128b60

纠错
反馈