我想匹配一个字符串,它可能在匹配之前包含某种字符,或者匹配可能从字符串的开头开始(对于字符串的结尾也是如此)。
作为一个最小的例子,考虑文本 n.b.
,我想在行首和行尾或两个非单词字符之间或某种组合之间进行匹配。最简单的方法是使用单词边界( \bn\.b\.\b
),但这并不匹配;类似的情况发生在其他所需的带有非单词字符的匹配项中。
我目前正在使用 (^|[^\w])n\.b\.([^\w]|$)
, 效果令人满意,但也会匹配出现在单词前后的非单词字符(如破折号)(如果可用)。我在 grep 中执行此操作,因此虽然我可以轻松地将输出通过管道传输到 sed,但我使用的是 grep 的 --color
选项,当管道到另一个命令时被禁用(出于明显的原因)。
编辑:\K
选项(即 (\K^|[^\w])n\.b\.(\K[^\w]|$)
似乎有效,但它也会丢弃输出中匹配项的颜色。虽然我可以再次调用辅助工具,但如果有快速简单的解决方案,我会喜欢它。
编辑:我误解了 \K
运算符(operator);它只是从使用前的匹配中删除所有文本。难怪它无法为输出着色。
最佳答案
如果你使用 grep,你必须使用 -P
选项,或环视和 \K
会抛出错误。这意味着您还可以使用负面的环视。这是您的正则表达式的更简单版本:
(?<!\w)n\.b\.(?!\w)
另外,请注意
(?<=...)
和 (?<!...)
是 回顾 , 和 (?=...)
和 (?!...)
是 前瞻 .你标题的措辞表明你可能把它们搞混了,这是初学者常见的错误。
关于regex - grep regex 前瞻或字符串开始(或后视或字符串结尾),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29909601/