正则表达式非捕获组 - 没用?

tho*_*mas 2 javascript regex

我试图理解这个概念,但我真的看不出它有什么用处,所以我假设我没有抓住重点。

例如 -

此正则表达式/([0-9]+)(?:st|nd|rd|th)?/将匹配带有或不带有“st”、“rd”等后缀的数字。

所以"1st".match(/([0-9]+)(?:st|nd|rd|th)?/g)返回 ["1st"]

"1".match(/([0-9]+)(?:st|nd|rd|th)?/g) 返回 ["1"]

但是,如果没有(?:) 标准,这仍然完全相同!

"1st".match(/([0-9]+)(st|nd|rd|th)?/g) 返回 [“第一个”]

谢谢...

Exp*_*lls 6

非捕获分组更快,因为正则表达式引擎不必跟踪匹配。为了清晰起见,最好不要捕捉不需要捕捉的内容。例如:

(foo|bar)((z|q)s?)?
Run Code Online (Sandbox Code Playgroud)

这有点做作,但您可以轻松地将其应用于真正的正则表达式。您可以匹配foozfoozs。我们对fooandbar部分以及zor感兴趣q,但我们不关心 optional s。那么哪个部分是zq?它是第 2 组还是第 3 组?想象一下,如果我们有的话(?:(z|q)。现在,我们知道只有两个捕获组,因此我们不必进行这种心理上的跳跃。


有时非捕获是必要的,例如对于 JavaScript 的.split.

如果分隔符包含捕获括号,则在数组中返回匹配的结果。

如果您想对拆分使用分组,但又不想在数组中包含拆分正则表达式,则必须使用非捕获组。