0

我有一种感觉,这将作为副本关闭,因为这似乎是一个常见的问题......但在我的辩护中,我已经搜索了 SO 以及谷歌,但找不到任何东西。

我正在尝试使用 ripgrep 搜索 SQL 文件,但我想排除作为单行 SQL 注释一部分的匹配项。

  • 我不需要担心多行/* foobar */注释。只有单行-- foobar
  • 我不需要捕捉任何东西
  • 我不需要担心字符串可能是文本的一部分,比如SELECT '-- foobar'or SELECT '--', foobar。我可以接受那些错误的排除。

匹配示例:

  • 匹配:SELECT foobar
  • 匹配:, foobar
  • 排除:SELECT baz -- foobar
  • 排除:-- foobar
  • 排除:---foobar
  • 排除:-- blah foobar blah

又名,搜索foobar但忽略匹配如果--出现在该行之前的任何点。

我已经尝试过诸如负面后视和其他方法之类的方法,但我似乎无法让它们发挥作用。

这个答案似乎会让我到达那里: https ://stackoverflow.com/a/13873003/3474677

该答案说用于查找不以 . 开头的(?<!grad\()vec匹配项。所以如果我把它翻译成我的用例,我会得到. 这有效......但仅用于排除包含它的行不处理其他场景。vecgrad((?<!--)foobar--foobar

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

4

1 回答 1

1

根据评论,使用 ripgrep 和 enable--pcre2您可以使用:

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

查看正则表达式演示

于 2021-11-25T01:21:36.800 回答