2017-08-28 10 views
0

を使用するドキュメントの種類別セグメントを探しますか?正規表現は、次のような集合が与えられるサブ正規表現

明確にするため、「START」タグと「END」タグの間には任意の数のサブタグを置くことができます。

これは私が今作業している正規表現ですが、問題は "START" "END"ペアと一致しない場合にだけ次のものに移動して選択することです。

START:TITLE\n(?!NAME)(.|\n|)*?(?:NAME:\s*(?!IgnoreMe).*)(.|\n|)*?END:TITLE 

正しいタイトルがすぐに見つからない場合、どのようにして一致させないようにしますか?

+1

「タイトル」とは何ですか? – CinCout

+0

リピートキャプチャグループは最後のマッチをキャプチャします。 –

答えて

2

正規表現は、このようなものでなければなりません:

(?s)START:ITEM\b((?:(?!START:ITEM).)*?\bNAME:(CaptureMe|IgnoreMeNot).*?)END:ITEM 

説明:

(?s) 
START:ITEM\b 
(?: 
    ((?!START:ITEM).)*?    # negative lookahead: 
            # read lazily characters while there is no START:ITEM ahead 
    \bNAME:(CaptureMe|IgnoreMeNot) # capture only names CaptureMe and IgnoreMeNot 
    .*?        # read lazily characters until you get to the END:ITEM 
) 
END:ITEM 

は、この単純な1トリックを行う必要がありますregex101.com

+0

'NAME'で終わる行(' FIRSTNAME'など)がある場合、間違った行を捕捉しません:https://regex101.com/r/ytI12n/6 – Mistalis

+0

@Mistalis十分に公正です。 https://regex101.com/r/ytI12n/7のような境界\ bを追加してください –

-1

を見てみましょう

(?s)START:ITEM.*NAME:CaptureMe.*?END:ITEM 

この場合には、特定の名前の値を持つすべてのブロックを探していると、NAME:(?S)のように使用できる修飾子についてはCaptureMe

、また、this site

を参照してください*。 ?何時でも、遅いことを意味します。次のブロックが見つかると停止します。

+0

私は正直なところ、この回答が理由なしにdownvotedされた理由を知りたいです... –

関連する問題