如果字符串以另一个字符串开头,则排除匹配
Exclude match if string is prefaced with another string
我觉得这会作为重复项被关闭,因为这似乎是一个常见的问题......但在我的辩护中,我搜索了 SO 以及 Google 但找不到任何东西。
我正在尝试使用 ripgrep 搜索 SQL 文件,但我想排除属于单行 SQL 评论的匹配项。
- 我不需要担心多行
/* foobar */
评论。只有单行 -- foobar
- 我不需要捕捉任何东西
- 我不需要担心字符串成为文本一部分的可能性,例如
SELECT '-- foobar'
或 SELECT '--', foobar
。我同意那些错误的排除。
匹配示例:
- 匹配:
SELECT foobar
- 匹配:
, foobar
- 排除:
SELECT baz -- foobar
- 排除:
-- foobar
- 排除:
---foobar
- 排除:
-- blah foobar blah
AKA,搜索 foobar
,但如果 --
出现在该行之前的任何位置,则忽略匹配。
我已经尝试过负面回顾和其他方法,但我似乎无法让它们发挥作用。
这个答案似乎会让我到达那里:
那个答案说使用 (?<!grad\()vec
来查找 vec
的匹配项,这些匹配项没有以 grad(
开头。因此,如果我将其转化为我的用例,我将得到 (?<!--)foobar
。这有效...但仅用于排除包含 --foobar
的行,它不处理其他情况。
最坏的情况,我可以将 ripgrep 的结果通过管道传输到另一个过滤器并排除匹配的行 --.*foobar
,但我希望找到一个一体化的解决方案。
根据评论,使用 ripgrep 并启用 --pcre2
您可以使用:
^(?:(?!--).)*\bfoobar\b
^
字符串开头
(?:
非捕获组
(?!--).
否定前瞻,断言从当前位置开始没有 --
直接向右。如果该断言为真,则匹配除换行符之外的任何字符
)*
关闭非捕获组并选择性重复
\bfoobar\b
匹配单词 foobar
看到一个regex demo。
我觉得这会作为重复项被关闭,因为这似乎是一个常见的问题......但在我的辩护中,我搜索了 SO 以及 Google 但找不到任何东西。
我正在尝试使用 ripgrep 搜索 SQL 文件,但我想排除属于单行 SQL 评论的匹配项。
- 我不需要担心多行
/* foobar */
评论。只有单行-- foobar
- 我不需要捕捉任何东西
- 我不需要担心字符串成为文本一部分的可能性,例如
SELECT '-- foobar'
或SELECT '--', foobar
。我同意那些错误的排除。
匹配示例:
- 匹配:
SELECT foobar
- 匹配:
, foobar
- 排除:
SELECT baz -- foobar
- 排除:
-- foobar
- 排除:
---foobar
- 排除:
-- blah foobar blah
AKA,搜索 foobar
,但如果 --
出现在该行之前的任何位置,则忽略匹配。
我已经尝试过负面回顾和其他方法,但我似乎无法让它们发挥作用。
这个答案似乎会让我到达那里:
那个答案说使用 (?<!grad\()vec
来查找 vec
的匹配项,这些匹配项没有以 grad(
开头。因此,如果我将其转化为我的用例,我将得到 (?<!--)foobar
。这有效...但仅用于排除包含 --foobar
的行,它不处理其他情况。
最坏的情况,我可以将 ripgrep 的结果通过管道传输到另一个过滤器并排除匹配的行 --.*foobar
,但我希望找到一个一体化的解决方案。
根据评论,使用 ripgrep 并启用 --pcre2
您可以使用:
^(?:(?!--).)*\bfoobar\b
^
字符串开头(?:
非捕获组(?!--).
否定前瞻,断言从当前位置开始没有--
直接向右。如果该断言为真,则匹配除换行符之外的任何字符
)*
关闭非捕获组并选择性重复\bfoobar\b
匹配单词foobar
看到一个regex demo。