2013-08-21 66 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