regex - grep regex 前瞻或字符串开始(或后视或字符串结尾)

标签 regex grep lookahead lookbehind

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

作为一个最小的例子,考虑文本 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/

相关文章:

perl - grep 变量并给出信息输出

linux - 在一个文件的行中搜索另一个文件中的部分匹配项(Mac/Linux/Unix 命令行)

c# - 正则表达式同时向前看和向后看

正则表达式匹配 {1,2,3,4} 的所有排列而不重复

php - 正则表达式练习 : reluctant quantifier with a lookahead assertion

python - BeautifulSoup 中的 re.compile 有什么用?

javascript - 需要在Javascript中编写正则表达式

ruby - 用 Ruby 中的一个标签替换顺序重复标签

javascript - 使用 javascript 从 URL 字符串中删除特定事件

linux - 在 drupal 语言中 : grep and pipe - list all the findings to avoid overhead & serverperformance issues