簡體   English   中英

如果字符串以另一個字符串開頭,則排除匹配

[英]Exclude match if string is prefaced with another string

我有一種感覺,這將作為副本關閉,因為這似乎是一個常見的問題......但在我的辯護中,我已經搜索了 SO 以及谷歌,但找不到任何東西。

我正在嘗試使用 ripgrep 搜索 SQL 文件,但我想排除屬於單行 SQL 注釋的匹配項。

  • 我不需要擔心多行/* foobar */注釋。 只有單行-- foobar
  • 我不需要捕捉任何東西
  • 我不需要擔心字符串可能成為文本的一部分,例如SELECT '-- foobar'SELECT '--', foobar 我可以接受那些錯誤的排除。

匹配示例:

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

AKA,搜索foobar但如果--出現在該行之前的任何點,則忽略匹配。

我已經嘗試過諸如負面后視和其他方法之類的方法,但我似乎無法讓它們發揮作用。

這個答案似乎會讓我到達那里: https://stackoverflow.com/a/13873003/3474677

該答案說使用(?<!grad\()vec來查找不以grad(開頭的vec匹配項。因此,如果我將其轉換為我的用例,我將得到(?<!--)foobar 。這有效...但僅用於排除包含--foobar的行,它不處理其他場景。

最壞的情況,我可以將 ripgrep 的結果 pipe 放入另一個過濾器並排除匹配的行--.*foobar但我希望找到一個多合一的解決方案。

根據評論,使用 ripgrep 和 enable --pcre2您可以使用:

^(?:(?!--).)*\bfoobar\b
  • ^字符串開頭
  • (?:非捕獲組
    • (?.--). 負前瞻,從當前 position 斷言沒有--直接向右。 如果該斷言為真,則匹配除換行符以外的任何字符
  • )*關閉非捕獲組並選擇性地重復它
  • \bfoobar\b匹配單詞foobar

查看正則表達式演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM