为什么我的 pcregrep 正则表达式中的正向先行不起作用?

Why is the positive lookahead in my pcregrep Regex not working?

我使用 pcregrep 编写了一个 Regex,在我添加正向预测之前,一切都按预期运行。

场景:

我有以下文本文件:

a
b
c
a
c

目标:

我想使用带有 pcregrep 的正则表达式来 return 包含 a 的行和包含 c 的行以及包含 b 的行,它们之间是 没有被捕获。因此它将捕获前三行 (abc) 和 return 第一行 (a) 和第三行 (c ) 线。它会 不会 捕获第四行和第五行,因为它们之间没有 b 行。所以输出将是:

a
c

我试过的

如果我运行 pcregrep -M 'a\nb\nc\n' (command 1),这捕获和returns:

a
b
c

符合预期。所以我现在想修改它以捕获具有正前瞻性的 b 行。我试过这个:pcregrep -M 'a\n(?=(b\n))c\n'命令 2)。然而,这return没什么。

我的问题:

为什么 command 2 不是 return 预期的输出,而 command 1 是?我怎样才能return想要的结果?我知道除了 pcregrep 之外还有其他方法可以做到这一点,但请注意我想使用 pcregrep 因为我将扩展功能来解决类似的问题。

谢谢!

Why does command 2 not return the expected output, where command 1 does? Because command 2 is a different expression

(?=…) 是零宽度前瞻

您指定的是:我想要一个 a,然后是一个换行符,然后是一个 b,然后是一个换行符。在那个位置我还想要一个 c 后跟一个换行符。

P.S。只得到 a 和 c 也许这会有帮助?

pcregrep -M 'a\nb\nc\n' | pcregrep -M 'a|c'

您可以通过 -o 选项使用 2 个捕获组:

pcregrep -M -o1 -o2 '(a\n)b\n(c)\n' file

a
c

详情:

  • (...):在正则表达式中用于捕获组
  • -o1 -o2:仅打印捕获组 #1 和 #2

请注意,您的正则表达式 a\n(?=(b\n))c\n 将不起作用,因为前瞻只是与 zero-width 匹配的断言。您的正则表达式断言 b\na\n 之后存在,这很好,但它会在 a\n 之后尝试匹配 c\n ,这就是匹配失败。