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

wal*_*ous 41 grep pcre

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

我正在尝试grep -oP "(?:syntaxHighlighterConfig\.)[a-zA-Z]+Color" SyntaxHighlighter.js使用此代码,并期望结果如下:

wikilinkColor
externalLinkColor
parameterColor
...
Run Code Online (Sandbox Code Playgroud)

但相反,我得到:

syntaxHighlighterConfig.wikilinkColor
syntaxHighlighterConfig.externalLinkColor
syntaxHighlighterConfig.parameterColor
...
Run Code Online (Sandbox Code Playgroud)

Ken*_*ent 60

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

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

  • 对于引用,`(?<= ...)`是**正向后看断言**,`(?<!...)`是负向后看断言**,`(?= ...)`是**正向前瞻断言**,和`(?!...)`是**负前瞻断言**.[更多此处](http://www.regular-expressions.info/lookaround.html). (12认同)
  • Lookbehinds需要固定长度.在这种情况下,它有所帮助,但在其他情况下却没有. (7认同)
  • 是否有任何变体可以处理可变宽度?例如,如果不是圆点,我在后面的末尾有一个未知数量的空格,想要执行grep -Po“(?&lt;= syntaxHighlighterConfig +)[a-zA-Z] + Color”文件。现在,我收到抱怨“ grep:断言后面的长度不是固定的”。谢谢。 (3认同)
  • 您可以使用“\K”作为可变长度负向后查找...“保留\K左侧的内容。” (3认同)