在正则表达式中,捕获组是十分重要的概念,它可以将匹配到的部分提取出来。但是有时候我们并不关心某些子表达式的值,只是希望它们能够匹配成功,并且不会干扰到我们需要提取的内容。这时候,非捕获组就派上用场了。本文将详细介绍 ECMAScript 2018 中加入的非捕获组。
什么是非捕获组
非捕获组(Non-capturing group)是一种特殊的匹配模式,可以匹配指定的模式但不进行捕获。在正则表达式中,捕获组用小括号 ( )
括起来,而非捕获组则是在小括号与 ?
之间加入符号 >
, 形如 (?>)
。
使用非捕获组可以提高正则表达式的效率,因为大多数情况下捕获组的功能并不需要。如果不需要捕获,使用非捕获组可以避免产生一个新的捕获组对象。
非捕获组的语法
非捕获组的语法很简单,只需要在小括号和 ?
之间加入符号 >
即可。
例如,下面是一个使用非捕获组的正则表达式示例:
/^(?>\d{3})\d{3}-\d{4}$/
在上述正则表达式中,(?>\d{3})
匹配任意的三个数字,但是不会像普通的捕获组一样将其内容提取出来。接着,\d{3}-\d{4}
匹配由一个连字符分隔开的 7 位数字序列。
非捕获组的应用场景
非捕获组可以在一个复杂的正则表达式中帮助我们提高性能,而不需要关心其中某些匹配是否需要被捕获。下面我们来看几个示例,展示非捕获组的应用场景。
示例一:匹配连续的数字
我们希望匹配连续的数字,这个用正则表达式是非常简单的,我们可以使用 \d+
表达式来匹配,其中 +
表示匹配一次或多次。但是,如果我们需要在某些情况下更精确地匹配,比如我们不希望将三个以上的数字匹配到,可以使用非捕获组 (?>\d{1,2})
:
/^(?:\d{1,2}|(?>\d{3}))(?:(?:,\d{3})+|\.\d{2})$/
上述正则表达式可以匹配以数字开头,数字之间用逗号分隔,以小数点结尾的字符串。其中,(?>\d{3})
匹配三个连续的数字,并且不会将其内容捕获。
示例二:匹配 HTML 元素
有时候需要从 HTML 标记中提取出所有的元素,但是我们不关心每个元素的样式或者属性。此时,我们可以使用下面的正则表达式:
/<[^>]*>(.*?)<\/[^>]*>/g
其中,[^>]
表示匹配任何一个字符,但不包括大于号;.*?
表示匹配任意字符零次或多次,但最小匹配,这里捕获了我们需要的标记内容;<\/[^>]*>
表示匹配 /
和任意的字符,但不包括 >
,用于匹配闭合标记。在上述正则表达式中,使用了非捕获组 (?:)
来提高效率,避免了不必要的内容捕获。
总结
本文介绍了 ECMAScript 2018 新特性之非捕获组 (?>)
,并列举了其在正则表达式中的应用场景。使用非捕获组可以提高效率,避免不必要的内容捕获。在编写复杂的正则表达式时,学会使用非捕获组可以让我们的正则表达式更加精细和高效。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c804f85ad90b6d04128b60