2016-05-26 9 views
1

Frage:Java RegexMuster auf mehr von gleichen Tags passend

Wie kann ich <tag TAG1>SOME VALUE</tag TAG1><tag TAG1>ANOTHER VALUE</tag TAG1> als 2 separate Werte erfolgreich Vorstellungen?

Hintergrund:

ich versucht bin eine Zeichenfolge entsprechen als solche <tag TAG1>SOME VALUE</tag TAG1><tag TAG1>ANOTHER VALUE</tag TAG1> Wo TAG1 ist der Name dieser spezifischen Tag (mehrere Tags mit dem gleichen Namen, aber unterschiedliche Werte haben kann) und SOME VALUE, ANOTHER VALUE sind unterschiedlich Werte, die von den Tags eingeschlossen sind.

Bisher bin ich in der Lage ein Paar von Tags als solche <tag TAG1>SOME VALUE</tag TAG1> mit dem RegexMuster übereinstimmen <\\s*tag\\s*.+\\s*>(.*)</\\s*tag\\s*.+\\s*>

Das obige Beispiel ist ein Worst-Case-Szenario ohne Zeichen das Ende des ersten Tag und dem Start Trenn von der Sekunde. Mein Problem ist, wenn ich find() mit meiner Regex-Zeichenfolge ausführen, bekomme ich beide Tags, als ob sie ein Tag wären.

Das Problem ist mit dem Platzhalter zwischen den Tags (.*), weil es das Ende/den Anfang eines Tags nicht ausschließt. Ich brauche die Wildcard-Übereinstimmung, weil ein beliebiges Zeichen (einschließlich \n) in den Tags enthalten sein könnte. Ich verwende auch Pattern.DOTALL, um 1 Tag erfolgreich mit Zeilenumbrüchen zu verknüpfen.

+0

Wie @R Nar erwähnt auf dieser letzten [Python Frage] (http://stackoverflow.com/ Fragen/37446964/simple-regex-for-simple-xml-string): [regex nicht zum parsen von xml] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except- xhtml-self-contained-tags/1732454 # 1732454) – Parfait

+0

Es ist nicht unbedingt XML, nur eine schnelle Version zum Erstellen/Lesen von Eingabedateien eine Vorlage Datei gegeben. Alles funktioniert jetzt wie erwartet :) – Chris

Antwort

1

Hier ist, wie Sie es tun könnte:

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()); 
} 

Ausgang:

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

Wer auch immer abgestimmt hat, könntest du mir bitte sagen, warum ich mir erlauben soll, meine Antwort zu verbessern? –

+1

Eine nützliche Haftungsausschluss könnte sein, dies nicht für HTML/XML-Parsing zu verwenden, da es nicht funktioniert (geschachtelte Tags, Eigenschaften, etc.). Mein Fall war spezifisch und verschachtelte Tags oder Tag-Eigenschaften existierten nicht, also arbeitete Regex für mich. – Chris

Verwandte Themen