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

时间:2019-05-31 18:18:37

标签: regex pcre regex-lookarounds pcregrep

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

场景:

我有以下文本文件:

a
b
c
a
c

目标:

我想使用带有Regreg和pcregrep的函数来返回包含a的行和包含c的行以及包含b的行,它们之间是 not 已捕获。因此它将捕获前三行(abc)并返回第一行(a)和第三行(c)。由于它们之间没有b行,因此不会捕获第四行和第五行。因此输出为:

a
c

我尝试过的事情

如果我运行pcregrep -M 'a\nb\nc\n'命令1 ),则会捕获并返回:

a
b
c

符合预期。因此,我现在想修改它以捕获b行,并且正向。我尝试了以下操作:pcregrep -M 'a\n(?=(b\n))c\n'命令2 )。但是,这什么也不会返回。

我的问题:

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

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以将2个捕获组与values选项一起使用:

-o

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

详细信息:

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

请注意,您的正则表达式-o1 -o2无效,因为超前只是具有零宽度匹配的断言。您的正则表达式断言在a\n(?=(b\n))c\n之后存在b\n,这很好,但是它会尝试在{strong> a\n之后紧接着匹配c\n,这就是匹配失败的地方。

答案 1 :(得分:1)

  

为什么命令2不返回预期的输出,而命令1为何返回?   因为命令2是不同的表达式

view.setVisibility(View.VISIBLE); //view is visible view.setVisibility(View.INVISIBLE); //view is invisible, but still takes up space view.setVisibility(View.GONE); //view is no longer visible, and does not take up space 是零宽度的前瞻性

您指定的是:我想要一个(?=…),然后是一个换行符,之后是一个a,然后是一个换行符。在那个位置,我还想要b后跟换行符。

P.S。仅获取a和c也许会有所帮助吗?

c