基本上我想在未注释的行上找到 foobar,例如:
// foobar # do not match me
foobar # match me
otherfoobar # do not match me
为了匹配我使用的注释行:^(\s*//\s*)\bfoobar\b.*$
如何匹配未注释的行?
笔记:
为避免不必要的努力,请将答案限制为“^...$”。这必须纯粹在发送到 perl 进行匹配的字符串中完成。
foobar 也必须像 \bfoobar\b 一样整体匹配
最后, \bfoobar\b 除了空格或注释签名之外,不应以任何内容开头。
foobar
在 a 右侧未找到的A//
可以表示为:这是一个由 0 个或多个 (
*
) 字符 (.
) 组成的序列,每个字符都不在//
序列 ((?!//)
) 的开头,后跟一个foobar
由单词边界分隔的字符。我认为否定的问题不应该过于复杂。
例如说我希望拒绝这些行:
IE。
'//'
在开头的空白处的任何地方都有注释签名,然后是包含'foobar'
整个单词的任何内容(为清楚起见包括括号)。为了否定这一点,我们这样做:
我们只是替换
(\s*//\s*)
为(?!\s*//\s*)
这忽略了任何在空格中任何地方都有注释签名的东西,
'//'
开头是我们的模式。结果:
注意:
.*
您可以通过更改之前的设置来进一步微调(\bfoobar...
。例如我可以
"^(?!\s*//\s*)\s*(\bfoobar\b).*$"
警告: 如果您曾经
'foobar'
用一些任意字符串替换'${foobar}'
并尝试上述方法,它将失败。原因是您的正常 'foobar' 仅由单词字符组成,现在(\bfoobar\b)
不会匹配它。在这种情况下,\b
必须删除。如果您使用的是 Perl(语言)而不是使用 Perl 兼容正则表达式的工具,则没有理由将自己限制在一个正则表达式中。
像这样的东西只匹配未注释的行:
即使使用其他实用程序或非 Perl 正则表达式,使用多个正则表达式可能是最简单的:
相反,如果您仅限于单个 Perl 正则表达式,那么这应该可以:
这
\s*+
是一个“占有式”表达式,它匹配所有前导空格,并且不会放开它们。然后(?!//)
检查前导空格之后的内容是否不是注释标记,最后我们foobar
在该行的任何位置查找分词符。(如果空格在没有所有格限定符的情况下匹配,则正则表达式引擎可能会从前导空格中退出,并检查错误位置的注释标记,从而导致匹配的注释行。)
测试数据: