我正在阅读Groovy教程,他们讨论了如何通过使用?:引导组创建非匹配组。这样,这个小组就不会出现在比赛上了。我不明白的是,你为什么要明确地说,不要与这个群体相匹配。不把它分成一组不是更简单吗?
发布于 2013-11-01 03:27:34
?:用于分组,但当您不想捕获它们时。这对于代码的简洁是有用的,有时也是必要的。这有助于在匹配之后不存储我们随后不需要的东西,从而节省空间。
它们也主要与|操作符一起使用。
交替运算符在所有regex运算符中的优先级最低。也就是说,它告诉regex引擎要么将所有内容匹配到垂直条的左侧,要么将所有内容匹配到垂直条的右侧。如果要限制交替的范围,则需要使用括号进行分组。(http://www.regular-expressions.info/alternation.html)。
在这种情况下,您不能离开它们而不将它们放在一个组中。您将需要在许多常用的规则,如电子邮件,url等的交替运算符。希望这有帮助。
/(?:http|ftp):\/\/([^\/\r\n]+)(\/[^\r\n]*)?/g是JavaScript中的一个样例URL,它需要替换操作符,需要分组。如果不进行分组,则所有http的匹配都将是http。
发布于 2013-11-01 04:10:25
使用非捕获组至少有四个原因:
1) 保存内存:当您匹配捕获组时,组的内容将独立存储在内存中,无论您是否需要它。当您使用regex并将结果存储在一组大数据上时,内存中的空间会迅速增加。例如,[0-9]+(, [0-9]+)*将匹配由逗号和空格(如15, 13, 14 )分隔的一系列整数。让我们假设您只需要来自结果(组0)的整个匹配字符串。不过,在本例中,您将真正存储"15, 13, 14"和", 14",因为后者位于捕获的组中。您可以使用[0-9]+(?:, [0-9]+)*来节省内存和时间。对于这样一个简单而简短的示例来说,这可能并不重要,但是对于更复杂的正则表达式,这些额外的内存使用量会迅速增加。另外,非捕获组的处理速度也更快。
2) Simpler :如果您有类似于([a-z]+)( \.)* ([a-z]+) ([a-z]+)的正则表达式,并且希望提取这三个单词,则需要使用组1、3和4。虽然这并不十分困难,但假设您需要在后两个单词(如([a-z]+)( \.)* ([a-z]+)( \.)* ([a-z]+) )之间添加另一个组。如果在代码后面的几个地方使用这些组,可能很难找到它们。相反,您可以首先编写([a-z]+)(?: \.)* ([a-z]+) ([a-z]+),然后将其更改为([a-z]+)(?: \.*) ([a-z]+)(?: \.)* ([a-z]+),这两个词分别与组1、2和3匹配。
3) 外部依赖项:您可能有一个函数或库,需要接收与n组完全匹配的正则表达式。这是一个不寻常的例子,但使所有其他组不捕获将满足需求。
4) 组计数限制:大多数语言对正则表达式中捕获组的总数都有限制。不寻常的是,需要很多组(比如python 100),这是可能的。通过使用不受此限制的非捕获组,您可以使用较少的组,并减少遇到此限制的次数。例如:
((one|1), )((two|2), )…((nine_hundred_ninety_nine|999), )在某些语言中,…是所有中间组都无法匹配的地方,因为它有太多的捕获组。但是:
(?:(one|1), )(?:(two|2), )…(?:(nine_hundred_ninety_nine|999), )将匹配并仍然返回所有组,如one或22。
https://stackoverflow.com/questions/19719910
复制相似问题