groovy 非捕获组的目的是什么

uajslkp6  于 7个月前  发布在  其他
关注(0)|答案(2)|浏览(63)

我在阅读Groovy教程,他们谈到了如何通过使用?:引导组来创建非捕获组。这样的话,球队就不会出现在比赛中。
我不明白的是为什么你要明确地说不符合这个群体。不把它放在一个组里不是更简单吗?

lnlaulya

lnlaulya1#

?:用于分组,但当您不想捕获它们时。这对于代码的简洁性很有用,有时候也是非常必要的。这有助于在匹配后不存储我们不需要的东西,从而节省空间。
它们也主要与|运算符结合使用。
交替运算符在所有正则表达式运算符中优先级最低。也就是说,它告诉正则表达式引擎要么匹配垂直条左边的所有内容,要么匹配垂直条右边的所有内容。如果要限制交替的范围,则需要使用括号进行分组。(http://www.regular-expressions.info/alternation.html)。
在这种情况下,你不能把它们放在一个组里。在很多常见的正则表达式中,比如email,url等,你都需要用到交替运算符。希望能帮上忙。
/(?:http|ftp):\/\/([^\/\r\n]+)(\/[^\r\n]*)?/g是JavaScript中的一个示例URL正则表达式,它需要交替运算符并需要分组。如果不分组,所有http url的匹配将只有http

cu6pst1q

cu6pst1q2#

使用非捕获组至少有四个原因:
1)保存内存:当您匹配一个捕获组时,无论您是否需要,该组的内容都独立存储在内存中。当您使用正则表达式并将结果存储在一个大型数据集上时,内存中的空间会迅速增加。例如,[0-9]+(, [0-9]+)*将匹配一系列由逗号和空格分隔的整数,如15, 13, 14。让我们假设你只需要结果(组0)中的整个匹配字符串。不过,在本例中,实际上存储的是"15, 13, 14"", 14",因为后者位于捕获的组中。您可以通过使用[0-9]+(?:, [0-9]+)*来保存内存和时间。对于这样一个简单而简短的例子来说,这可能没有关系,但是对于更复杂的正则表达式,这些额外的内存使用量会迅速增加。作为奖励,* 非捕获组的处理速度也更快。*
2)代码更简单:如果你有一个像([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), )

将匹配并仍然返回所有组,如one22

相关问题