2016-03-29 10 views
-1

Ich schreibe ein Java-Programm, wo es einige Daten gibt, die aus einem String gezogen werden müssen (in der Praxis ist dies html).Übereinstimmende simultane Tags in Java String

Mein Code ist wie folgt:

while ((line = in.readLine()) != null) { 
       if (line.contains("xrefInternal")) { 
        String ftnNum = line.replaceAll("(.*)(<sup>)([0-9]+)(</sup>)(.*)", "$3"); 
        String ftnRefNum = line.replaceAll("(.*)(<span class=\"xrefInternal\" id=\"fo)([0-9]+)(\")(.*)", "$3"); 
        System.out.println(ftnRefNum + "\t" + ftnNum); 
       } 
      } 

Während die Arbeit an diesem ich in 2 Fällen in meiner Datei kam.

Fall 1

<p class="paraNoIndent1" style="text-indent: 0%;">texy<span class="xrefInternal" id="fo249"><a href="abc.html#fo_249"><sup>2</sup></a></span> Tewxt.<span class="xrefInternal" id="fo250"><a href="abc.html#fo_250"><sup>3</sup></a></span> text</p> 

Fall 2

<p class="paraNoIndent1" style="text-indent: 0%;">Text.<span class="xrefInternal" id="fo248"><a href="abc.html#fo_248"><sup>1</sup></a></span></p> 

Case 1 nichts drucken. Es wird übersprungen (ich denke, dass ich versuche, zwei Datenelemente im selben Parameter zu holen).

Case 2 druckt das Ergebnis als

248 1 

Hier wie unten erwartet funktioniert Regex Fiddle

Bitte lassen Sie mich wissen, wie Sie den Code überarbeiten, so dass Case 1 wie Case 2

Dank funktioniert

+2

Pflicht Links: (allgemein) http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags (genauer) http://stackoverflow.com/q/701166/1393766. – Pshemo

+2

Aus diesem Grund verwendet man Regex nicht zum Parsen von XML oder HTML. XML und HTML sind keine regulären Sprachen und können normalerweise nicht mit regex analysiert werden, außer in sehr begrenzten Fällen. Verwenden Sie einen echten HTML- oder XML-Parser. –

Antwort

0

Das von Ihnen beschriebene Verhalten ist kein Ergebnis der Regel x, und kann nicht mit dem bereitgestellten Code reproduziert werden.

(.. Ich werde aktualisieren/löschen diese, wenn/falls mehr Informationen zur Verfügung gestellt Es ist zu lang für einen Kommentar, und wird die Flagge Menschen helfen)

I erhalten (Text stellt Beispielnummer):

250 one 3 
248 two 1 

Wenn ich laufen diese:

String example1="<p class=\"paraNoIndent1\" style=\"text-indent: 0%;\">texy<span class=\"xrefInternal\" id=\"fo249\"><a href=\"abc.html#fo_249\"><sup>2</sup></a></span> Tewxt.<span class=\"xrefInternal\" id=\"fo250\"><a href=\"abc.html#fo_250\"><sup>3</sup></a></span> text</p>"; 


String ftnNum = example1.replaceAll("(.*)(<sup>)([0-9]+)(</sup>)(.*)", "$3"); 
String ftnRefNum = example1.replaceAll("(.*)(<span class=\"xrefInternal\" id=\"fo)([0-9]+)(\")(.*)", "$3"); 
System.out.println(ftnRefNum + " one " + ftnNum); 

String example2="<p class=\"paraNoIndent1\" style=\"text-indent: 0%;\">Text.<span class=\"xrefInternal\" id=\"fo248\"><a href=\"abc.html#fo_248\"><sup>1</sup></a></span></p>"; 
String ftnNum2 = example2.replaceAll("(.*)(<sup>)([0-9]+)(</sup>)(.*)", "$3"); 
String ftnRefNum2 = example2.replaceAll("(.*)(<span class=\"xrefInternal\" id=\"fo)([0-9]+)(\")(.*)", "$3"); 

System.out.println(ftnRefNum2 + " two " + ftnNum2);