【发布时间】:2019-05-31 18:18:37
【问题描述】:
我使用 pcregrep 编写了一个正则表达式,一切都按预期运行,直到我添加了一个积极的前瞻。
场景:
我有以下文本文件:
a
b
c
a
c
目标:
我想使用带有 pcregrep 的正则表达式来返回包含a 的行和包含c 的行以及它们之间包含b 的行,但没有被捕获。因此它将捕获前三行(a、b、c)并返回第一行(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,因为我将扩展功能以解决类似问题。
谢谢!
【问题讨论】:
-
请记住,使用前瞻时,您不会不匹配前瞻中的字符。您只断言(不匹配字符)前瞻模式存在。您仍然必须匹配整个模式,并且前瞻再次不匹配,仅断言。
-
@K.Dᴀᴠɪs 明白了,谢谢。所以我现在尝试使用非捕获组,如下所示:pcgrep -M 'a\n(?:(b\n))c\n'。然而,这仍然返回'a'、'b'、'c'。你知道我怎样才能让它只返回'a''c'吗?
标签: regex pcre regex-lookarounds pcregrep