2012-03-31 8 views
2

Ich versuche, erhalte die folgende regex zu bekommen auf meinem String zu arbeiten:NULL-Werte von Java Regex Matcher mit einem gefundenen Muster

Pattern Regex = Pattern.compile("(?:(\\d+) ?(days?|d) *?)?(?:(\\d+) ?(hours?|h) *?)?(?:(\\d+) ?(minutes?|m) *?)?(?:(\\d+) ?(seconds?|s))?", 
Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); 
Matcher RegexMatcher = Regex.matcher(myString); 
while (RegexMatcher.find()) { 
     ... 
} 

.. teilt er sich im Grunde eine Zeichenfolge wie 1 Tag 3 Stunden in übereinstimmende Regex-Gruppen.

Das Problem, das ich habe, ist, dass, wenn ich in die While-Schleife, Anrufe an RegexMatcher.group(i) immer einen NULL Wert zurückgeben, was bedeutet, dass sie nicht in der Zeichenfolge gefunden wurden.

Wenn ich die Ausgabe versuchen RegexMatcher.group(0), gibt es eine leere Zeichenfolge, obwohl myString definitelly wie "hello 1d" enthält -, die mindestens erste Gruppe als "1" und zweitens als "d" zurückkehren.

Ich habe überprüft und überprüft die Regex und es scheint in Ordnung zu sein. Keine Ahnung was hier falsch ist.

Vielen Dank für alle Ideen :-)

+0

ich den Verdacht haben, dass es zu einem nicht-einfangenden Gruppen in engem Zusammenhang steht . – Corbin

+0

hat versucht, alle nicht-einfangenden Gruppen sowie die Pattern.CANON_EX-, Pattern.UNICODE_CASE- und Pattern.CASE_INSENSITIVE-Flags ohne Erfolg zu entfernen. –

+0

hat außerdem versucht, Capture-Gruppen in nicht erfassenden Gruppen zu entfernen und die großen nicht-einfangenden Gruppen vollständig zu entfernen. keine Freude dort –

Antwort

2

Für eine Matcher m, Eingangssequenz s und Gruppenindex g sind die Ausdrücke m.group(g) und s.substring(m.start(g), m.end(g)) gleichwertig.

Fanggruppen werden von links nach rechts indiziert, beginnend bei eins. Gruppe Null bezeichnet das gesamte Muster, daher entspricht der Ausdruck m.group(0)m.group().

Wenn die Übereinstimmung erfolgreich war, die angegebene Gruppe jedoch nicht mit einem Teil der Eingabesequenz übereinstimmt, wird null zurückgegeben. Beachten Sie, dass einige Gruppen, z. B. (a*), mit der leeren Zeichenfolge übereinstimmen. Diese Methode gibt die leere Zeichenfolge zurück, wenn eine solche Gruppe die leere Zeichenfolge in der Eingabe erfolgreich abgleicht.

Wenn Sie alle Spiele zu ergodische möchten, können Sie Code wie:

Pattern Regex = Pattern 
      .compile(
        "(?:(\\d+) ?(days?|d) *?)?(?:(\\d+) ?(hours?|h) *?)?(?:(\\d+) ?(minutes?|m) *?)?(?:(\\d+) ?(seconds?|s))?", 
        Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE 
          | Pattern.UNICODE_CASE); 
    Matcher RegexMatcher = Regex.matcher("1 d 3 hours"); 
    while (RegexMatcher.find()) { 
     System.out.println(RegexMatcher.group()); 
    } 

Hinweis: m.group() entspricht m.group(0)

+2

Es lohnt sich, darauf hinzuweisen, dass die Hälfte davon von http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group (in) – Corbin

+0

stammt Danke, ich schätze ich bekomme es jetzt :) –