如果字符串以另一个字符串开头,则排除匹配

Exclude match if string is prefaced with another string

我觉得这会作为重复项被关闭,因为这似乎是一个常见的问题......但在我的辩护中,我搜索了 SO 以及 Google 但找不到任何东西。

我正在尝试使用 ripgrep 搜索 SQL 文件,但我想排除属于单行 SQL 评论的匹配项。

匹配示例:

AKA,搜索 foobar,但如果 -- 出现在该行之前的任何位置,则忽略匹配。

我已经尝试过负面回顾和其他方法,但我似乎无法让它们发挥作用。

这个答案似乎会让我到达那里:

那个答案说使用 (?<!grad\()vec 来查找 vec 的匹配项,这些匹配项没有以 grad( 开头。因此,如果我将其转化为我的用例,我将得到 (?<!--)foobar。这有效...但仅用于排除包含 --foobar 的行,它不处理其他情况。

最坏的情况,我可以将 ripgrep 的结果通过管道传输到另一个过滤器并排除匹配的行 --.*foobar,但我希望找到一个一体化的解决方案。

根据评论,使用 ripgrep 并启用 --pcre2 您可以使用:

^(?:(?!--).)*\bfoobar\b
  • ^ 字符串开头
  • (?:非捕获组
    • (?!--). 否定前瞻,断言从当前位置开始没有 -- 直接向右。如果该断言为真,则匹配除换行符之外的任何字符
  • )*关闭非捕获组并选择性重复
  • \bfoobar\b 匹配单词 foobar

看到一个regex demo