2016-05-26 26 views
1

質問:のJava正規表現パターン

どのように私は成功し<tag TAG1>SOME VALUE</tag TAG1><tag TAG1>ANOTHER VALUE</tag TAG1> 2として独立した値と一致していますか?

背景:

私はTAG1は、その特定のタグ(複数のタグが同じ名前で異なる値を持つことができます)とSOME VALUEの名前であり、ANOTHER VALUEが異なるよう<tag TAG1>SOME VALUE</tag TAG1><tag TAG1>ANOTHER VALUE</tag TAG1> などの文字列にマッチしようとしていますタグで囲まれた値。

は、これまでのところ私は、正規表現パターンを使用して、このような<tag TAG1>SOME VALUE</tag TAG1>などのタグの1組に一致させることができる午前<\\s*tag\\s*.+\\s*>(.*)</\\s*tag\\s*.+\\s*>

たとえば上記の最初のタグと開始の終わりを分離文字なしで最悪のシナリオであります2番目の私の問題は、正規表現の文字列でfind()を実行すると、両方のタグが1つのタグであるかのように取得されます。

問題は、タグの末尾/開始を除外しないため、タグ(.*)の間にワイルドカードが付いています。任意の文字(\nを含む)がタグ内にある可能性があるため、ワイルドカードの照合が必要です。私はPattern.DOTALLを使って、1つのタグと改行をうまく一致させることもできます。ここで

+0

@Rナールは、この最近の[Pythonの質問]に言及したよう(http://stackoverflow.com/単純な正規表現のための正規表現を使用しないでください(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except- xhtml-self-contained-tags/1732454#1732454) – Parfait

+0

必ずしもXMLではなく、入力ファイルの作成/読み込み用のクイックバージョン与えられたテンプレートファイル。まだすべてが期待通りに働いています:) – Chris

答えて

1

は、あなたがそれを行うことができる方法である:

String value = "<tag TAG1>SOME VALUE</tag TAG1><tag TAG1>ANOTHER VALUE</tag TAG1>"; 
Pattern pattern = Pattern.compile("<\\s*tag\\s*[^>]+\\s*>([^(</)]*)</\\s*tag\\s*[^>]+\\s*>"); 
Matcher matcher = pattern.matcher(value); 
while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 

出力:

<tag TAG1>SOME VALUE</tag TAG1> 
<tag TAG1>ANOTHER VALUE</tag TAG1> 
+0

投票した人は、私が私の答えを改善できる理由を教えてください。 –

+1

有用な免責条項は、HTML/XML解析では使用できないため(ネストされたタグ、プロパティなど)、これを使用しないことがあります。私のケースは特定で、ネストされたタグやタグのプロパティは存在しないので、Regexは私のために働いた。 – Chris