为什么我的pcregrep Regex中的正向前看不起作用?

qco9c6ql  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(98)

我使用pcregrep编写了一个正则表达式,在我添加了一个积极的前瞻之前,一切都按预期进行。

场景:

我有以下文本文件:

a
b
c
a
c

目标:

我想使用正则表达式和pcregrep来返回一个包含a的行和一个包含c的行,在它们之间有一个包含b的行,这是 * 未 * 捕获的。(abc)并返回第一行(a)和第三行(c)。它不会 * 捕获第四行和第五行,因为它们之间没有b行。因此输出将是:

a
c

我所尝试的

如果我运行pcregrep -M 'a\nb\nc\n'command 1),这将捕获并返回:

a
b
c

正如预期的那样。所以我现在想修改它以捕获具有正向前看的b行。我尝试了以下操作:pcregrep -M 'a\n(?=(b\n))c\n'command 2),但是没有返回任何结果。

我的问题:

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

pinkon5k

pinkon5k1#

您可以使用2个带有-o选项的捕获组:

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

详情:

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

注意,你的正则表达式a\n(?=(b\n))c\n不会工作,因为lookahead只是Assert零宽度匹配。你的正则表达式在a\n之后Assertb\n的存在,这很好,但它试图匹配c\n紧接在a\n之后,这就是匹配失败的地方。

a11xaf1n

a11xaf1n2#

为什么命令2没有返回预期的输出,而命令1却返回?因为命令2是不同的表达式
(?=…)是零宽度前瞻
您指定的是:我想要一个a,后面跟着一个换行符,后面跟着一个b,后面跟着一个换行符。在那个位置,我还想要一个c,后面跟着一个换行符。
pidoss.只是得到a和c,也许这会有帮助?
pcregrep -M 'a\nb\nc\n' | pcregrep -M 'a|c'

相关问题