regex - 如何使用 ag 或 rg(PCRE/Rust 正则表达式)在不同行中匹配包含 word1 和 word2 的所有文件

标签 regex regex-lookarounds ag

我有一长串要过滤的生成报告。报告是这样的:

Report Name
Report Date
Blah blah blah
Blah: WORD1
Blah blah
blah blah: WORD2
blah blah

我正在尝试使用 ag(PCRE regex)或 rg(rust regex)并在文件的不同位置(包含新行)查找包含 WORD1 和 WORD2 的所有文件。

我已经搜索 SX 并发现这些不起作用:
> ag (?=.*WORD1)(?=.*WORD2)

> ag (?=.*WORD1)((.|\n)*)(?=.*WORD2)

更新

正如@WiktorStribiżew 指出的那样,该 ag 使用 PCRE。抱歉我的错误。

我的预期输出是:
blah blah: WORD2

或者只是匹配文件的列表。

附言目前我已经设法使用这个:
> ag "WORD2" $(ag -l "WORD1")

最佳答案

您可以使用 PCRE 模式与 ag :

(?s)^(?=.*WORD1)(?=.*WORD2).*\n\K(?-s).*WORD2

regex demo .

详情 :
  • (?s) - DOTALL 修饰符开启(. 匹配换行符)
  • ^ - 字符串开头
  • (?=.*WORD1) - 必须有 WORD1字符串中的某处
  • (?=.*WORD2) - 必须有 WORD2字符串中的某处
  • .* - 任何 0+ 字符,尽可能多,直到最后一次出现后续子模式(如果您使用惰性 *? 量词,.*? 将匹配尽可能少的 0+ 字符,直到第一次出现后续子模式)
  • \n - 换行
  • \K - 匹配重置运算符丢弃当前匹配的文本
  • (?-s) - 禁用 DOTALL 模式(. 不匹配换行符)
  • .*WORD2 - 除换行符以外的任何 0+ 个字符,尽可能多,然后是 WORD2 .
  • 关于regex - 如何使用 ag 或 rg(PCRE/Rust 正则表达式)在不同行中匹配包含 word1 和 word2 的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44753891/

    相关文章:

    javascript - 将函数调用与 JS Regex 匹配

    r - 如何替换特定的尾随字符但阻止前两个字母

    javascript - 正则表达式性能 : Alternation vs Trie

    full-text-search - 用ag计算目录中的匹配总数

    ag - 如何强制 ag 在 node_modules 中查找匹配项?

    javascript - 表单验证正则表达式和 DOM : What would be the best way to implement regex in a form validation

    python - 获取正则表达式匹配后的第一个单词

    java - 如何检查给定的 Java 正则表达式在 Python 中是否有效

    python - 删除除特定组合外的任何小写字符

    linux - 使用 ack 搜索多个模式(单词)?