如何在 grep 中使用非捕获组?

Posted

技术标签:

【中文标题】如何在 grep 中使用非捕获组?【英文标题】:How to use non-capturing groups in grep? 【发布时间】:2013-02-14 16:37:54 【问题描述】:

This answer 建议grep -P 支持(?:pattern) 语法,但它似乎对我不起作用(该组仍被捕获并作为匹配的一部分显示)。我错过了什么吗?

我在this code 上尝试grep -oP "(?:syntaxHighlighterConfig\.)[a-zA-Z]+Color" SyntaxHighlighter.js,并期望结果是:

wikilinkColor
externalLinkColor
parameterColor
...

但我得到了:

syntaxHighlighterConfig.wikilinkColor
syntaxHighlighterConfig.externalLinkColor
syntaxHighlighterConfig.parameterColor
...

【问题讨论】:

你能展示一些样本输入/输出吗? @sputnick 我编辑了问题以添加更多详细信息。 你应该在展示你所期望或你得到什么之前包含你正在抓取的文件的内容 【参考方案1】:

“非捕获”并不意味着该组不是比赛的一部分;这意味着该组的值不会保存用于反向引用。您正在寻找的是一个后视零宽度断言

grep -Po "(?<=syntaxHighlighterConfig\.)[a-zA-Z]+Color" file

【讨论】:

注意所有的lookbehinds都是零宽度 Lookbehinds 需要固定长度。在这种情况下它会有所帮助,但在其他情况下则没有。 对于引用,(?&lt;=…)正向后视断言(?&lt;!…)负向后视断言(?=…)正向前瞻断言,而(?!…)否定前瞻断言。 More here. 是否有任何变体可以处理可变宽度?例如。如果不是点,我在后视的末尾有未知数量的空格,并且想做grep -Po "(?&lt;=syntaxHighlighterConfig +)[a-zA-Z]+Color" file。现在我收到投诉grep: lookbehind assertion is not fixed length。谢谢。 您可以使用\K 作为可变长度的负向回溯... Keep the stuff left of \K.

以上是关于如何在 grep 中使用非捕获组?的主要内容,如果未能解决你的问题,请参考以下文章

从 Grep RegEx 中捕获组

具有多个捕获组的 R 中的正则表达式组捕获

如何在 grep 中进行非贪婪匹配?

嵌套捕获组如何在正则表达式中编号?

如何在 Xcode 11 的查找和替换中引用捕获组?

非捕获组仍然显示在比赛中