我们什么时候需要非捕获组?

时间:2016-04-10 03:53:48

标签: regex

在这个例子中,我知道它可以匹配起始处有三个字母或三个破折号的字符串,最后三个字符必须是数字。但我不明白SchemaValidator在这个例子中做了什么:

?:

有人可以解释我们何时需要非捕获组?感谢。

2 个答案:

答案 0 :(得分:2)

你永远不会需要非捕获组,但它们有一些优点:

  • 捕获组从左到右编号。您可以使用这些数字在反向引用中引用该组,并在提取该组匹配的文本时使用这些数字。通过将某些组标记为非捕获,它们不会对编号做出贡献,这意味着您关注的组的编号将更简单:1,2,3 ......没有任何间隙;您可以稍后插入或删除非捕获组,而不会更改任何捕获组的数字。

  • 不捕获组会使其更有效(取决于特定的正则表达式API),因为它不需要存储或返回与该组匹配的字符串。

  • 文档:标记哪些组正在捕获和不捕获这些组使其个人目的更加清晰。

在您的具体示例中,两个内部组完全没有必要,因为它们不用于捕获,也不用于替换,也不用于任何其他功能。它可以缩写为:(?:\w{3}|-{3})\d\d\d$

答案 1 :(得分:0)

非捕获组有助于在捕获组中获取不需要的数据。

例如,你的字符串看起来像

abc and bcd
def or cef

在这里,您要捕获由and && or分隔的第一列和第三列数据。所以你写下正则表达式如下

(\w+)\s+(and|or)\s+(\w+) 

此处$1包含第一列

abc def

然后$3包含

bcd cef

然后将不必要的数据存储到$2 and or。在这种情况下,您不希望存储不必要的数据,因此将使用非捕获组。

(\w+)\s+(?:and|or)\s+(\w+) 

这里$ 1包含

abc 
def

$ 2包含

bcd
def

并将获得非捕获组的确切数据。

例如

(?:don't (want))

现在$1包含数据want

然后它还有助于在分组内执行|条件。例如

(?:don't(want)|some(what))

在上面的示例中,$1包含数据want,而$2包含数据what