2016-04-22 4 views
1

Ich habe folgenden Text:Regex für Text zwischen Tags zu extrahieren, aber nicht die Tags

<Data> 
    <xpath>/Temporary/EIC/SpouseSSNDisqualification</xpath> 
    <Gist>AllConditionsTrue</Gist> 
    <Template> 
     <Text id="1">Your spouse is required to have a Social Security number instead of an ITIN to claim this credit. This is based on the IRS rules for claiming the Earned Income Credit.</Text> 
    </Template> 
</Data> 
<Data> 
    <xpath>/Temporary/EIC/SpouseSSNDisqualification</xpath> 
    <Gist>AllConditionsTrue</Gist> 
    <Template> 
     <Text id="1">Your spouse has the required Social Security number instead of an ITIN to claim this credit. This is based on the IRS rules for claiming the Earned Income Credit.</Text> 
    </Template> 
</Data> 

Ich mag würde die Daten zwischen den xpath Tags extrahieren, aber nicht den Tags selbst.

Ausgang sollte sein:

/Temporary/EIC/SpouseSSNDisqualification

/Temporary/EIC/SpouseSSNDisqualification

Diese Regex scheint mir zu geben, den gesamten Text einschließlich der xpath Tags, die ich nicht will:

<NodeID>(.+?)<\/NodeID>

Edit:

Hier ist mein Java-Code, aber ich bin nicht sicher, ob dieser Wert auf meine Frage hinzufügen würde:

try { 
     String xml = FileUtils.readFileToString(file); 
     Pattern p = Pattern.compile("<xpath>(.+?)<\\/xpath>"); 
     Matcher m = p.matcher(xml); 

     while(m.find()) { 
      System.out.println(m.group(0)); 
     } 
    } 
+0

Die Frage wird viel besser sein, wenn Sie auch den Java-Code, den Sie versuchten –

+1

[XML nicht mit Regex zu parsen] (http://Stackoverflow.com/a/1732454/2482744) (die Antwort sagt HTML aber es ist das gleiche Problem) –

+1

Sie haben mit der Capture-Gruppe '(xxx)' aufgenommen, was Sie wollen, benutzen Sie es einfach, indem Sie 'group (1)' aufrufen. 'group (0)' gibt das gesamte Übereinstimmungsmuster zurück, nicht nur den erfassten Teil. --- Obwohl ich mit @AlexHall einverstanden bin: ** Verwenden Sie keine Regex, um Text aus XML zu extrahieren. ** Verwenden Sie einen XML-Parser. – Andreas

Antwort

3

Einfach. Das liegt daran, dass Sie das gesamte Ergebnis und nicht nur den Wert für Gruppe 1 übernehmen.

String nodestr = "<xpath>/Temporary/EIC/SpouseSSNDisqualification</xpath>"; 
String regex = "<xpath>(.+?)<\/xpath>"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(nodestr); 
if (matcher.matches()) { 
    String tag_value = matcher.group(1); //taking only group 1 
    System.out.println(tag_value); //printing only group 1 
} 
+1

Entkommen Sie nicht '/'. Es hat keine Bedeutung in einem Java-Regex, daher ist das Entkommen nicht notwendig. – Andreas

+0

Danke @Aminah Nuraini –

+0

@arabian_albert. Dann akzeptiere bitte die Antwort :) –

1

Sie könnten versuchen, einen vorausschauenden und einen Blick hinter Ansatz:

Pattern pattern = Pattern.compile("(?<=<xpath>)(.*?)(?=</xpath>)"); 
Matcher matcher = pattern.matcher(str); 
while (matcher.find()) { 
    String group = matcher.group(); 
    System.out.println(group); 
} 

Ich glaube, dass ein Weg sauberer Ansatz ist.