2009-06-25 10 views
4

Aus einer Zeichenfolge, muss ich Gruppen, die ein bestimmtes Muster entsprechen ziehen.Java - Reg Ausdruck mit Gruppen

Ein Beispiel string: <XmlLrvs>FIRST</XmlLrvs><XmlLrvs>SECOND</XmlLrvs><XmlLrvs>Third</XmlLrvs>

Jede Gruppe wird mit <XmlLrvs> beginnen und mit </XmlLrvs> beenden. Hier ist ein Ausschnitt aus meinem Code ...

String patternStr = "(<XmlLrvs>.+?</XmlLrvs>)+"; 

// Compile and use regular expression 
Pattern pattern = Pattern.compile(patternStr); 
Matcher matcher = pattern.matcher(text); 
matcher.matches(); 

// Get all groups for this match 
for (int i = 1; i<=matcher.groupCount(); i++) { 
    System.out.println(matcher.group(i)); 
} 

Der Ausgang <XmlLrvs>Third</XmlLrvs> ist. Ich erwarte Gruppe zuerst und Sekunde, aber diese werden nicht gefangen genommen. Kann jemand helfen?

Antwort

8

Sie durchlaufen die Gruppen, wenn Sie über Übereinstimmungen iterieren müssen. Die matches() Methode überprüft die gesamte Eingabe auf eine Übereinstimmung. Was Sie wollen, ist die find() Methode.

ändern

matcher.matches(); 

for (int i = 1; i<=matcher.groupCount(); i++) { 
    System.out.println(matcher.group(i)); 
} 

zu

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

Beachten Sie, dass die + in der Regex entfernt werden muss, oder alles auf einmal abgestimmt werden, und nicht in drei Iterationen. – molf

+1

Ich stimme damit nicht überein, das. +? ist ein nicht-gieriger Quantifizierer. Aber ich habe es nicht getestet. – waxwing

+2

Ich meine das Finale +. – molf

0

Probieren Sie es
String patternStr = "<XmlLrvs>(.*?)</XmlLrvs>";
String text = "<XmlLrvs>FIRST</XmlLrvs><XmlLrvs>SECOND</XmlLrvs><XmlLrvs>Third</XmlLrvs>";
Pattern pattern = Pattern.compile(patternStr);

Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
System.out.println(matcher.group(1));
}

The output is FIRST,SECOND,Third