首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非匹配组的目的是什么?

非匹配组的目的是什么?
EN

Stack Overflow用户
提问于 2013-11-01 02:30:40
回答 2查看 578关注 0票数 3

我正在阅读Groovy教程,他们讨论了如何通过使用?:引导组创建非匹配组。这样,这个小组就不会出现在比赛上了。我不明白的是,你为什么要明确地说,不要与这个群体相匹配。不把它分成一组不是更简单吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 3
EN

Stack Overflow用户

发布于 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),这是可能的。通过使用不受此限制的非捕获组,您可以使用较少的组,并减少遇到此限制的次数。例如:

代码语言:javascript
复制
((one|1), )((two|2), )…((nine_hundred_ninety_nine|999), )

在某些语言中,是所有中间组都无法匹配的地方,因为它有太多的捕获组。但是:

代码语言:javascript
复制
(?:(one|1), )(?:(two|2), )…(?:(nine_hundred_ninety_nine|999), )

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19719910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档