我试图理解这个概念,但我真的看不出它有什么用处,所以我假设我没有抓住重点。
例如 -
此正则表达式/([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) 返回 [“第一个”]
谢谢...
非捕获分组更快,因为正则表达式引擎不必跟踪匹配。为了清晰起见,最好不要捕捉不需要捕捉的内容。例如:
(foo|bar)((z|q)s?)?
Run Code Online (Sandbox Code Playgroud)
这有点做作,但您可以轻松地将其应用于真正的正则表达式。您可以匹配fooz或foozs。我们对fooandbar部分以及zor感兴趣q,但我们不关心 optional s。那么哪个部分是z或q?它是第 2 组还是第 3 组?想象一下,如果我们有的话(?:(z|q)。现在,我们知道只有两个捕获组,因此我们不必进行这种心理上的跳跃。
有时非捕获是必要的,例如对于 JavaScript 的.split.
如果分隔符包含捕获括号,则在数组中返回匹配的结果。
如果您想对拆分使用分组,但又不想在数组中包含拆分正则表达式,则必须使用非捕获组。