grep regex前视或字符串开头(或后视或字符串结尾)

grep regex前视或字符串开头(或后视或字符串结尾),regex,grep,lookahead,lookbehind,Regex,Grep,Lookahead,Lookbehind,我想匹配一个字符串,该字符串可能在匹配之前包含一种字符类型,或者匹配可能从字符串的开头开始(与字符串的结尾相同) 对于一个极小的例子,考虑文本 N.B.< /代码>,我想在一行的开头和一行的结尾或两个非单词字符之间,或者一些组合中匹配。最简单的方法是使用单词边界(\bn\.b\.\b),但这并不匹配;类似的情况也发生在其他需要的匹配中,其中包含非单词字符 我目前使用的是(^ |[^\w])n\.b\([^\w]|$),它可以令人满意地工作,但也会匹配出现在单词前后的非单词字符(如破折号),如果可

我想匹配一个字符串,该字符串可能在匹配之前包含一种字符类型,或者匹配可能从字符串的开头开始(与字符串的结尾相同)

对于一个极小的例子,考虑文本<代码> N.B.< /代码>,我想在一行的开头和一行的结尾或两个非单词字符之间,或者一些组合中匹配。最简单的方法是使用单词边界(

\bn\.b\.\b
),但这并不匹配;类似的情况也发生在其他需要的匹配中,其中包含非单词字符

我目前使用的是
(^ |[^\w])n\.b\([^\w]|$)
,它可以令人满意地工作,但也会匹配出现在单词前后的非单词字符(如破折号),如果可用的话。我在grep中这样做,因此虽然我可以轻松地将输出导入sed,但我使用了grep的
--color
选项,当导入另一个命令时,该选项被禁用(原因很明显)

编辑:
\K
选项(即
(\K^[^\w])n\.b\(\K[^\w]|$)
似乎可以工作,但它也会在输出中放弃匹配的颜色。虽然我可以再次调用辅助工具,但如果有一个快速简单的解决方案,我会喜欢它


编辑:我误解了
\K
运算符;它只是从使用之前的匹配中删除所有文本。难怪它无法为输出着色。

显然,在lookahead/lookbehinds中匹配字符串的开头是可能的;显而易见的解决方案是
(?如果您使用的是grep,您必须使用
-p
选项,否则lookarounds和
\K
将抛出错误。这意味着您还可以使用负lookarounds。下面是一个简单的regex版本:

(?<!\w)n\.b\.(?!\w)
(?

另外,请注意
(?lookbehinds)和
(?=…)
(?!…)
arelookaheads。你的标题的措辞表明你可能把它们弄混了,这是一个常见的初学者错误。

我在Linux和OpenBSD中查找了grep的实现,但找不到-p选项。你能解释一下并显示它在使用中,以及你在哪个操作系统上做的吗?编辑-我找到了,它是GNU grep 3.0。