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" 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
4

1 に答える 1

1

これには否定先読みを使用できます。

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

これは、あなたが持っているすべてのドットをチェックしTRUEますEND。したがって、それ以外のブロックはすべてTRUE削除されます。

a を挿入し[\r\n]?て、物事を少しきれいにすることもできます。

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

regex101 を更新しました

編集: のみを特定したい場合FALSEは、この正規表現を使用できますが、これは少し長くなります:

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

これで regex101 を更新しました

于 2013-08-21T14:39:12.817 に答える