我有一长串要过滤的生成报告。报告是这样的:
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/