Java Matcher.find() gibt false nach Ausgabe zurück

Muuhmann

Lieutenant
Registriert
Sep. 2004
Beiträge
782
Hallo Leute,
kann mir einer folgenden Sachverhalt erklären?

Ich habe folgenden Code:
Code:
package std;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class test {
	public static void main(String[] args) {
		Matcher matcher = Pattern.compile("[0-9]{11}").matcher("Blablabla #12345678901 blablabla");
		// System.out.println(matcher.find());
		// System.out.println(matcher.find());
                if (matcher.find() == true) {
        	        System.out.println(matcher.group());
                }

	}

}

Die Ausgabe klappt wunderbar und zwar ist sie wie gewollt "12345678901"

Ok, wenn ich jetzt aber die // entferne um zu schauen, ob matcher.find() tatsächlich true zurück gibt, ist matcher.find() beim nächsten aufruf wieder false... warum?

Die Ausgabe wäre jetzt :
Code:
true
false
 
Ich denke (obwohl ich kein Java kann) das liegt daran, dass es immer das NÄCHSTE Vorkommen sucht, aber nicht automatisch wieder am Anfang des Inputs beginnt.

Aber wie gesagt ich kann kein Java, aber vielleicht hilft es dir ja.

Gruß,

badday
 
Da hast du recht, es wird bei jedem Aufruf von find() vom letzten Fundort aus weitergesucht. Steht auch in der Javadoc: http://www.j2ee.me/j2se/1.4.2/docs/api/java/util/regex/Matcher.html#find()
This method starts at the beginning of the input sequence or, if a previous invocation of the method was successful and the matcher has not since been reset, at the first character not matched by the previous match.
Man könnte dies nun lösen indem man die start-Variable mit übergibt aber richtigerweise speichert man für solche Geschichten das Ergebnis einfach in ner Variable (alles andere ist Ressourcenverschwendung):
Code:
boolean found = matcher.find();
System.out.println(found);
if(found){
     String tmp = matcher.group();      // natürlich nur falls du das nochmal anderswo brauchst ;)
     System.out.println(tmp);
}
 
ok, d.h. also, dass sobald mit .find() irgendwas gemacht wurde, sucht der direkt weiter?
 
Bei jedem Aufruf liefert er das nächste Suchergebnis und da es in deinem Beispiel nur eine Fundstelle gibt liefert find() eben ab dem zweiten Aufruf false.
Vergleichbar wie wenn du in Word in der Suche auf "weitersuchen" klickst. Da kommt ja auch das nächste Ergebnis.
 
Zurück
Oben