如何在 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 需要固定长度。在这种情况下它会有所帮助,但在其他情况下则没有。 对于引用,(?<=…)
是正向后视断言,(?<!…)
是负向后视断言,(?=…)
是正向前瞻断言,而(?!…)
是否定前瞻断言。 More here.
是否有任何变体可以处理可变宽度?例如。如果不是点,我在后视的末尾有未知数量的空格,并且想做grep -Po "(?<=syntaxHighlighterConfig +)[a-zA-Z]+Color" file
。现在我收到投诉grep: lookbehind assertion is not fixed length
。谢谢。
您可以使用\K
作为可变长度的负向回溯... Keep the stuff left of \K.
以上是关于如何在 grep 中使用非捕获组?的主要内容,如果未能解决你的问题,请参考以下文章