我希望匹配一个字符串,该字符串可能在匹配前包含一种字符,或者匹配可以从字符串的开头开始(对于字符串的结尾也是如此)。
对于一个最小的例子,考虑文本n.b.
,我想在一行的开头和行的结尾或两个非单词字符之间或某些组合中匹配。最简单的方法是使用单词边界(\bn\.b\.\b
),但这不匹配;类似的情况发生在其他所需的匹配中,其中包含非单词字符。
我目前正在使用(^|[^\w])n\.b\.([^\w]|$)
,它可以令人满意地工作,但也会匹配单词之前和之后出现的非单词字符(例如破折号)(如果可用)。我在grep中这样做,所以虽然我可以轻松地将输出传递给sed,但我使用的是grep的--color
选项,当用于管道输入另一个命令时会被禁用(出于显而易见的原因)。
编辑:\K
选项(即(\K^|[^\w])n\.b\.(\K[^\w]|$)
似乎有效,但它也会丢弃输出中匹配的颜色。虽然我可以再次调用辅助工具,但我会如果有一个快速而简单的解决方案,我会喜欢它。
\K
运算符;它只是在使用前删除匹配中的所有文本。难怪它没有为输出着色。
答案 0 :(得分:5)
如果您正在使用grep,则必须使用-P
选项或外观,\K
会抛出错误。这意味着您还可以使用否定外观。这是你的正则表达式的简单版本:
(?<!\w)n\.b\.(?!\w)
此外,请注意(?<=...)
和(?<!...)
lookbehinds ,(?=...)
和(?!...)
向前看 。你的标题的措辞表明你可能已经把这些混淆了,这是一个普通的初学者的错误。
答案 1 :(得分:2)
在lookahead / lookbehinds内部显然可以匹配字符串的开头;显而易见的解决方案是(?<=^|[^\w])n\.b\.(?=[^\w]|$)
。