1

我想删除从 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”开始、以“END”结束、内部带有“BOOL:FALSE”的每个块。另一种观点:我想保持每个集团都以“BEGIN”开始,以“END”结束,里面有“BOOL:TRUE”。

这个取第一个开始并在搜索结束之前搜索第一个 bool:false。那是不对的。(?s)(开始。?BOOL:FALSE。 ?END)

我想要什么就像使用过滤器一样

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

按 BOOL:FALSE 过滤

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

1 回答 1

1

您可以为此使用负前瞻:

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

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

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

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

更新了 regex101

编辑:如果你只想 pinpoint FALSE,你可以使用这个正则表达式,它有点长:

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

用这个更新了 regex101

于 2013-08-21T14:39:12.817 回答