如何在正则表达式中使用非捕获组,即(?:),它们有什么好处?
当前回答
(?:…)充当一个组(…),但不捕获匹配的数据。它确实比标准的捕获组效率高得多。当你想对某个东西进行分组,但以后不需要重用它时,就可以使用它了@托托
其他回答
我是一名JavaScript开发人员,将尝试解释其与JavaScript相关的意义。
考虑一个场景,你想将猫与动物相匹配当你想要匹配猫和动物时,两者之间应该有一个平衡点。
// this will ignore "is" as that's is what we want
"cat is animal".match(/(cat)(?: is )(animal)/) ;
result ["cat is animal", "cat", "animal"]
// using lookahead pattern it will match only "cat" we can
// use lookahead but the problem is we can not give anything
// at the back of lookahead pattern
"cat is animal".match(/cat(?= is animal)/) ;
result ["cat"]
//so I gave another grouping parenthesis for animal
// in lookahead pattern to match animal as well
"cat is animal".match(/(cat)(?= is (animal))/) ;
result ["cat", "cat", "animal"]
// we got extra cat in above example so removing another grouping
"cat is animal".match(/cat(?= is (animal))/) ;
result ["cat", "animal"]
打开您的Google Chrome devTools,然后单击Console选项卡:并键入以下内容:
"Peace".match(/(\w)(\w)(\w)/)
运行它,您将看到:
["Pea", "P", "e", "a", index: 0, input: "Peace", groups: undefined]
JavaScript RegExp引擎捕获三个组,索引为1、2、3的项。现在使用非捕获标记来查看结果。
"Peace".match(/(?:\w)(\w)(\w)/)
结果是:
["Pea", "e", "a", index: 0, input: "Peace", groups: undefined]
这是显而易见的非捕获组。
我不能评论最上面的答案来这样说:我想补充一个明确的观点,这只是在最上面的回答中暗示的:
非捕获组(?…)不会从原始完全匹配中删除任何字符,它只会对程序员进行可视化的正则表达式重组。
要访问正则表达式的特定部分而不定义外来字符,您将始终需要使用.group(<index>)
历史动机:
非捕获组的存在可以用括号来解释。
考虑表达式(a|b)c和a|bc,由于串联优先于|,这些表达式分别表示两种不同的语言({ac,bc}和{a,bc})。
然而,括号也用作匹配组(如其他答案所解释的…)。
当您想有括号但不想捕获子表达式时,可以使用NON-CAPTURING GROUPS。在示例中,(?:a|b)c
简单的答案
使用它们来确保在这里出现几种可能性中的一种(?:一个|两个)或可选短语camp(?:站点)?或者一般来说,任何你想建立一个组/短语/部分而不需要特别提及的地方。
他们将您捕获的组数保持在最小值。
推荐文章
- 在JavaScript中检查字符串包含另一个子字符串的最快方法?
- Python非贪婪正则表达式
- 正则表达式可以用来匹配嵌套模式吗?
- 在bash中使用正则表达式进行搜索和替换
- 将camelCaseText转换为标题大小写文本
- 正则表达式在Javascript中获取两个字符串之间的字符串
- Regex测试字符串是否以http://或https://开头
- 匹配HH:MM时间格式的正则表达式
- 使用String.split()和多个分隔符
- 从数字中移除无关紧要的尾随零?
- 最终的邮政编码和邮政正则表达式是什么?
- 删除多个空白空间
- 正则表达式不是运算符
- 如何通过正则表达式过滤熊猫行
- 我如何在JavaScript中使用unicode感知的正则表达式?