grep regex lookahead或字符串的开头(或lookbehind或字符串的结尾)

cos*_*rer 5 regex grep lookahead lookbehind

我想在匹配之前匹配一个可能包含一种字符的字符串,或者匹配可以从字符串的开头开始(对于字符串的结尾也是如此).

对于一个最小的例子,考虑n.b.我想要在一行的开头和一行的结尾或两个非单词字符之间或某种组合匹配的文本.最简单的方法是使用单词boundary(\bn\.b\.\b),但这不匹配; 类似的情况发生在其他所需的匹配中,其中包含非单词字符.

我目前正在使用(^|[^\w])n\.b\.([^\w]|$),它可以令人满意地工作,但也会匹配单词之前和之后出现的非单词字符(如短划线)(如果可用).我在grep中执行此操作,因此虽然我可以轻松地将输出传递给sed,但我使用的是grep --color选项,在使用其他命令时会被禁用(出于显而易见的原因).

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

编辑:我误解了\K操作员; 它只是在使用前删除匹配中的所有文本.难怪它没有为输出着色.

Ala*_*ore 6

如果您正在使用grep,则必须使用该-P选项或外观并且\K会抛出错误.这意味着您也可以使用负面的外观.这是你的正则表达式的简单版本:

(?<!\w)n\.b\.(?!\w)
Run Code Online (Sandbox Code Playgroud)

此外,请注意(?<=...)并且(?<!...)外观,(?=...)并且(?!...)前瞻性的.你的标题的措辞暗示你可能已经把那些混乱,一个普通的初学者的错误.

  • 我查看了grep的Linux和OpenBSD实现,但找不到-P选项.你能解释一下并在使用中显示它以及你在哪个操作系统上进行操作?编辑 - 我发现它,它是GNU Grep 3.0. (3认同)