为什么我的 pcregrep 正则表达式中的正向先行不起作用?
Why is the positive lookahead in my pcregrep Regex not working?
我使用 pcregrep 编写了一个 Regex,在我添加正向预测之前,一切都按预期运行。
场景:
我有以下文本文件:
a
b
c
a
c
目标:
我想使用带有 pcregrep 的正则表达式来 return 包含 a
的行和包含 c
的行以及包含 b
的行,它们之间是 没有被捕获。因此它将捕获前三行 (a
、b
、c
) 和 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\n
在 a\n
之后存在,这很好,但它会在 a\n
之后尝试匹配 c\n
,这就是匹配失败。
我使用 pcregrep 编写了一个 Regex,在我添加正向预测之前,一切都按预期运行。
场景:
我有以下文本文件:
a
b
c
a
c
目标:
我想使用带有 pcregrep 的正则表达式来 return 包含 a
的行和包含 c
的行以及包含 b
的行,它们之间是 没有被捕获。因此它将捕获前三行 (a
、b
、c
) 和 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\n
在 a\n
之后存在,这很好,但它会在 a\n
之后尝试匹配 c\n
,这就是匹配失败。