我使用pcregrep编写了一个正则表达式,在我添加正向前瞻之前,一切都按预期进行。
场景:
我有以下文本文件:
a
b
c
a
c
目标:
我想使用带有Regreg和pcregrep的函数来返回包含a
的行和包含c
的行以及包含b
的行,它们之间是 not 已捕获。因此它将捕获前三行(a
,b
,c
)并返回第一行(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
,因为我将扩展功能来解决类似的问题。
谢谢!
答案 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