Sonntag, 5. Juli 2009

Reguläre Ausdrücke: Grundlagen

Reguläre Ausdrücke (auf englisch Regular Expressions, oder kurz RegEx) sind ein ziemliches mächtiges Werkzeug, um mit Strings zu arbeiten. Allzuviele Grundlagen möchte ich jetzt allerdings nicht bringen, weil die verschiedenen Features in Pattern schon sehr übersichtlich aufgelistet sind. Ich erläutere es hier nur an einem Beispiel: Zahlen. Zahlen können in verschiedenen Formen vorhanden sein:
12
+12
12.0
Wir könnten natürlich noch 1.2E1 dazunehmen, aber das ist jetzt nicht, worauf es ankommt.
Zweck von RegEx ist es, von einem String herauszufinden, ob er eine bestimmte Form hat, oder wie ein Bestimmter Teil des Strings aussieht. Wie könnte man als RegEx darstellen, ob eine angegebene Zeichenkette eine Zahl darstellt?
Zuerst einmal das Vorzeichen: Das Vorzeichen kann + oder - sein, oder ganz fehlen:
[+-]?
Die eckigen Klammern geben an, dass eines der enthaltenen Zeichen folgt. Das Fragezeichen danach gibt an, dass der vorhergehende Ausdruck optional ist (genau ein- oder nullmal vorkommen kann).
Danach die Vorkommastellen:
\d+
\d ist die Menge aller Ziffern, das Pluszeichen gibt an, dass der vorige Ausdruck beliebig oft, aber mindestens einmal vorkommen kann. Vorher ist das Pluszeichen in einer Menge vorgekommen, dort verliert es seine Bedeutung
Die Nachkommastellen: Nachkommastellen müssen nicht vorhanden sein, aber wenn, es welche gibt, muss dem Dezimalpunkt mindestens eine Ziffer folgen:
(\.\d+)?
Die Klammern gruppieren den Punkt und die Nachkommastellen, denn es muss entweder beides oder keines geben. Der Backslash nimmt dem Punkt hier seine Bedeutung, denn normalerweise steht der Punkt für ein beliebiges Zeichen.

Der gesamte Ausdruck lautet also:
[+-]?\d+(\.\d+)?

Aber Achtung: um diesen Ausdruck in Java einzugeben, benötigt man
"[+-]?\\d+(\\.\\d+)?"
Der Backslash ist in Java nämlich, genau wie in RegEx, ein Escape-Zeichen. \n in einem Java-String steht für einen Zeilenumbruch, \\ steht für einen Backslash. Um also \. einzugeben, benötigt man \\.
Um in RegEx einen Backslash darzustellen, muss man \\ schreiben. aber um in Java \\ darzustellen, muss man \\\\ schreiben! Gefährlicher Stolperstein!

Um jetzt einfach nur festzustellen, ob ein String diesem RegEx entspricht, genügt die matches()-Methode der Klasse String. Außerdem Stellt String selbst noch weitere Methoden zur Verfügung, die mit regulären ausdrücken arbeiten:
replaceAll(String, String)
replaceFirst(String, String)
split(String)
split(String, int)

Die gleichen und noch viele weitere Möglichkeiten stehen mit Pattern und Matcher zur Verfügung. Aber das kommt erst nächstes Mal ;)

Keine Kommentare:

Kommentar veröffentlichen