在这个例子中,我知道它可以匹配起始处有三个字母或三个破折号的字符串,最后三个字符必须是数字。但我不明白SchemaValidator
在这个例子中做了什么:
?:
有人可以解释我们何时需要非捕获组?感谢。
答案 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
。