正则表达式按块内容过滤

时间:2013-08-21 14:32:26

标签: regex

我想删除每个以X开头的集团,以Y结尾并包含值Z

http://regex101.com/r/jS7eA5

文本:

BEGIN
DESCRIPTION: 1234
BOOL:TRUE
END
BEGIN
DESCRIPTION: 4568
BOOL:TRUE
END
BEGIN
DESCRIPTION: 715310
BOOL:FALSE
END
BEGIN
DESCRIPTION: 12489453
BOOL:TRUE
END
BEGIN
DESCRIPTION: 41543
BOOL:FALSE
END

结果:

BEGIN
DESCRIPTION: 1234
BOOL:TRUE
END
BEGIN
DESCRIPTION: 4568
BOOL:TRUE
END
BEGIN
DESCRIPTION: 12489453
BOOL:TRUE
END

在这里,我们要删除以“BEGIN”开头的每个块,ENDING BY“END”,WITH“BOOL:FALSE”INSIDE。 另一种观点:我想保持每个集团以“BEGIN”开头,以“END”结束,“BOOL:TRUE”。

这一个采取第一次开始和搜索第一个bool:false搜索结束之前。那是不对的。     (αS)(BEGIN BOOL:??FALSE END)

我希望在

上使用过滤器
(?s)(BEGIN.*?BOOL\:FALSE.*?END)

按BOOL过滤:FALSE

(?s)(BEGIN.*?BOOL\:FALSE.*?END)[.FILTERBY_BOOL:FALSE

1 个答案:

答案 0 :(得分:1)

您可以使用负向前瞻:

BEGIN((?!TRUE).)*?END

这将检查您拥有的每个点是否提前TRUE,直到END。因此,所有其他没有TRUE的块都将被删除。

您还可以插入[\r\n]?以使事情变得更清洁:

[\r\n]?BEGIN((?!TRUE).)*?END

Updated the regex101

编辑: 如果您只想查明FALSE,可以使用此正则表达式,这有点长:

[\r\n]?BEGIN(?:(?!FALSE|END).)*?FALSE(?:(?!FALSE|END).)*?END

Updated regex101 with this one