2013-08-21 26 views
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”开头的每个集合,ENDING BY“END”,“B” OOL:FALSE“INSIDE。另一种观点:我想要保持每一个由“BEGIN”开头的结尾,ENDING BY“END”,以及“BOOL:TRUE”INSIDE。

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

我希望它像什么用的过滤器上

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

过滤器由BOOL:FALSE

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

你在用什么语言? – Toto

回答

1

您可以对此使用负面预测:

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

这会检查fo r你有的每个点是否没有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

+1

我认为这是一个美丽的解决方案,为杰里+1。 –

+1

@Sniffer感谢您的领导:) – Jerry