Weitere Matcher-Methoden

(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)

Die folgenden Matcher-Methoden passen nicht so recht in die bisherigen Abschnitte:

Matcher reset()

Diese Methode setzt den Matcher in fast jeder Beziehung in den Ausgangszustand zurück; insbesondere wird jede Information über einen früheren Treffer weggeworfen, die Position im Text auf den Anfang des Texts zurückgesetzt und die Region (siehe Die Region des Matchers) auf den gesamten Suchtext zurückgesetzt. Nur die Flags »Anker-Grenzen« und »durchsichtige Grenzen« (siehe Durchsichtige Regionsgrenzen und Anker-Grenzen (anchoring bounds)) bleiben erhalten.

Die drei Methoden replaceAll, replaceFirst und die Ausprägung von find mit nur einem Argument verwenden intern reset und setzen die Region daher auf den voreingestellten Wert zurück, auf den ganzen Text.

Diese Methode gibt das Matcher-Objekt selbst zurück und kann deswegen mit anderen Methoden verkettet werden (siehe Verketten von Methoden).

Matcher reset(CharSequence text)

Diese Methode setzt – wie reset() – den Matcher in den Ausgangszustand zurück; außerdem wird aber der Suchtext durch einen neuen String (oder ein anderes Objekt, das eine CharSequence implementiert) ersetzt.

Wenn die gleiche Regex auf verschiedene Strings angewendet werden soll (beispielsweise auf alle Zeilen einer Datei), dann ist es effizienter, diese Methode zu benutzen, statt jedes Mal einen neuen Matcher zu erzeugen.

Diese Methode gibt das Matcher-Objekt selbst zurück und kann deswegen mit anderen Methoden verkettet werden (siehe Verketten von Methoden).

Pattern pattern()

Die pattern-Methode des Matchers gibt das mit diesem Matcher verbundene Pattern-Objekt zurück. Die dazugehörige Regex erhält man mit m.pattern().pattern(), dabei wird die pattern-Methode (siehe Weitere Pattern-Methoden) des Pattern-Objekts aufgerufen (die zwar genauso heißt, aber etwas ganz anderes bewirkt).

Matcher usePattern(Pattern p)

Diese Methode wechselt das mit dem Matcher verbundene Pattern-Objekt gegen ein anderes aus. Die Methode ruft aber intern nicht reset auf, man kann sie daher dazu benutzen, um von der »aktuellen Position« aus mit einer neuen Regex zu suchen. Im Programmbeispiel bei Hinzufügen von WIDTH- und HEIGHT-Attributen zu IMG-Tags in HTML wird diese Technik benutzt. usePattern gibt es erst seit Java 1.5.

Diese Methode gibt das Matcher-Objekt selbst zurück und kann deswegen mit anderen Methoden verkettet werden (siehe Verketten von Methoden).

String toString()

Ebenfalls seit Java 1.5 gibt es diese Methode, die einen String mit einigen grundlegenden Informationen über den Matcher erzeugt. Dies ist vor allem für Debugging-Zwecke nützlich. Inhalt und Formatierung dieses Strings sind nicht exakt spezifiziert und können sich durchaus noch ändern. Bei Java 1.6 gab das folgende Programmstück:

Matcher m = Pattern.compile("(\\w+)").matcher("ABC 123");
System.out.println(m.toString());
m.find();
System.out.println(m.toString());

folgende Zeilen aus:

java.util.regex.Matcher[pattern=(\w+) region=0,7 lastmatch=]
java.util.regex.Matcher[pattern=(\w+) region=0,7 lastmatch=ABC]

In Java 1.4.2 gab es in der Matcher-Klasse die von java.lang.Object vererbte toString-Methode, die aber bloß wertlose Informationen wie ›java.util.regex.Matcher@480457‹ zurückgab.

Den Suchtext des Matchers abfragen

Die Matcher-Klasse besitzt keine Methode, die den aktuellen Suchtext zurückgibt. Das folgende Programmstück erledigt dies:

// Pattern wird nur einmal kompiliert und abgespeichert.
static final Pattern pPasstImmer = Pattern.compile("^");

// Gibt den mit dem Matcher verbundenen Suchtext zurück.
public static String text(Matcher m) {
   // Region und aktuelles Pattern abspeichern.
   Integer regionStart = m.regionStart();
   Integer regionEnd   = m.regionEnd();
   Pattern pattern     = m.pattern();

  // Trick, um den Suchtext herauszuholen.
   String text = m.usePattern(pPasstImmer).replaceFirst("");

  // Matcher wieder in den unrsprünglichen Zustand bringen.
   m.usePattern(pattern).region(regionStart, regionEnd);

  // Suchtext zurückgeben.
   return text;
}

Hier wird replaceFirst mit einer Regex benutzt, die auf den Stringanfang passt, und dieser wird durch den Leerstring ersetzt – das ist natürlich eine Null-Operation, und das Resultat ist der unmodifizierte Suchtext. Dabei wird aber der Matcher in den Ausgangszustand zurückversetzt, deshalb werden die ursprüngliche Region und das Pattern abgespeichert und nach dem Ersetzen wiederhergestellt. Das ist weder besonders elegant noch effizient, und die Methode ergibt immer einen String, auch wenn der ursprüngliche Suchtext von einem anderen CharSequence-Typ war, aber solange es nichts Besseres gibt, tut die Methode ihren Dienst.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:
   

Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln