Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5
Java ist auch eine Insel

Java ist auch eine Insel
5., akt. und erw. Auflage
1454 S., mit CD, 49,90 Euro
Galileo Computing
ISBN 3-89842-747-1
gp Kapitel 4 Der Umgang mit Zeichenketten
  gp 4.1 Strings und deren Anwendung
    gp 4.1.1 String-Literale als String-Objekte für konstante Zeichenketten
    gp 4.1.2 String-Objekte neu anlegen
    gp 4.1.3 String-Länge
    gp 4.1.4 Gut, dass wir verglichen haben
    gp 4.1.5 String-Teile extrahieren
    gp 4.1.6 Suchen und Ersetzen
    gp 4.1.7 Veränderte Strings liefern
    gp 4.1.8 Unterschiedliche Typen in Zeichenketten konvertieren
  gp 4.2 Veränderbare Zeichenketten mit StringBuffer/StringBuilder
    gp 4.2.1 Anlegen von StringBuffer/StringBuilder-Objekten
    gp 4.2.2 Die Länge eines StringBuffer/Builder-Objekts lesen und setzen
    gp 4.2.3 Daten anhängen
    gp 4.2.4 Zeichen(folgen) setzen, erfragen, löschen und umdrehen
  gp 4.3 Vergleiche von Zeichenketten
    gp 4.3.1 equals() in String und StringBuffer/StringBuilder
    gp 4.3.2 equals() und hashCode() bei StringBuffer/StringBuilder
    gp 4.3.3 Sprachabhängiges Vergleichen mit der Collator-Klasse
    gp 4.3.4 Effiziente interne Speicherung für die Sortierung
  gp 4.4 Reguläre Ausdrücke
    gp 4.4.1 Die Klassen Pattern und Matcher
    gp 4.4.2 Mit MatchResult alle Ergebnisse einsammeln
    gp 4.4.3 Das alternative Paket org.apache.regexp
  gp 4.5 Zerlegen von Zeichenketten
    gp 4.5.1 Splitten von Zeichenketten mit split() aus Pattern
    gp 4.5.2 split() in String
    gp 4.5.3 Die Klasse Scanner
    gp 4.5.4 StringTokenizer
    gp 4.5.5 Der BreakIterator als Wort- und Satztrenner
  gp 4.6 Zeichenkodierungen
    gp 4.6.1 Kodierungen für unterschiedliche Codepages
    gp 4.6.2 Andere Klassen zur Konvertierung und das Paket java.nio.charset
    gp 4.6.3 Base64-Kodierung
  gp 4.7 Formatieren von Ausgaben
    gp 4.7.1 Zahlen, Prozente und Währungen mit NumberFormat formatieren
    gp 4.7.2 Dezimalzahlformatierung mit DecimalFormat
    gp 4.7.3 Formatieren mit format() aus String
    gp 4.7.4 Ausgaben formatieren mit MessageFormat


Galileo Computing

4.4 Reguläre Ausdrückdowntop

Mit dem Paket java.util.regex lässt sich mithilfe der Klassen Matcher und Pattern eine Zeichenkette gegen ein Muster prüfen. Mit dieser leistungsfähigen Implementierung lässt sich die Funktionalität von Dienstprogrammen wie awk, sed, emacs, perl oder grep mühelos nachbilden.


Galileo Computing

4.4.1 Die Klassen Pattern und Matcher  downtop

Im Prinzip besteht das Erkennen immer aus dem Aufbau eines Pattern-Objekts mit dem regulären Ausdruck und der Prüfung:

Pattern p = Pattern.compile( "a*b" );
Matcher m = p.matcher( "aaaaab" );
boolean b = m.matches();

Die einzelnen Zeilen lassen sich auch zusammenfassen:

boolean b = Pattern.matches( "a*b""aaaaab" );

Für reguläre Ausdrücke existieren eine ganze Menge von Regeln. Eine Übersicht findet sich in der API-Hilfe in der Klasse java.util.regex.Pattern. Widmen wir uns zunächst dem Funktionenangebot:


final class java.util.regex.  Pattern
  implements Serializable

gp  static Pattern compile( String regex ) Übersetzt den regulären Ausdruck in ein Pattern-Objekt.
gp  static Pattern compile( String regex, int flags ) Übersetzt den regulären Ausdruck in ein Pattern-Objekt mit Flags. Als Flags sind CASE_INSENSITIVE, MULTILINE, DOTALL, UNICODE_CASE und CANON_EQ erlaubt.
gp  int flags() Liefert die Flags, nach denen geprüft wird.
gp  Matcher matcher( CharSequence input ) Liefert ein Matcher-Objekt, das prüft.
gp  static boolean matches( String regex, CharSequence input ) Liefert true, wenn der reguläre Ausdruck regex auf die Eingabe passt.
gp  String pattern() Liefert den regulären Ausdruck, den das Pattern repräsentiert.

Einige Methoden sind lediglich Abkürzungen und Pattern.matches() macht nichts anderes, als ein Pattern zu compilieren und dann darauf matches() anzuwenden.

Pattern.compile( regex ).matcher( input ).matches()

Galileo Computing

4.4.2 Mit MatchResult alle Ergebnisse einsammeln  downtop

Die Schnittstelle java.util.regex.MatchResult definiert Methoden, die Zugriff auf das Ergebnis (String, Start-, Endposition, Anzahl Gruppen) eines Matches ermöglichen. Ein Matcher-Objekt wird dafür mit toMatchResult() nach dem MatchResult-Objekt gefragt.

Ein einfaches Beispiel verdeutlicht die Arbeitsweise: Die eigene Utility-Funktion findMatches() soll für ein Muster und eine Zeichenkette alle Ergebnisse zurückliefern.

Listing 4.4   MatchResultDemo.java, Teil 1

public static Iterable<MatchResult> findMatches( String patternCharSequence s )
{
  List<MatchResult> results = new ArrayList<MatchResult>();
  for ( Matcher m = Pattern.compile(pattern).matcher(s); m.find(); )
    results.add( m.toMatchResult() );
  return results;
}

Die Methode liefert ein Iterable zurück, sodass sich das Ergebnis auf der rechten Seite des Doppelpunktes vom erweiterten for nutzen lassen kann. (Wir können auch Collection oder List verwenden, doch die Liste soll von der Schnittstelle immutable sein.) Vor der Schleife wird aus dem Muster-String ein Pattern-Objekt – was für immer wieder kehrende Anfragen vorkompiliert werden sollte – und anschließend auf diesem matcher() aufgerufen, was Zugang zum konkreten Mustererkenner ist. Die Bedingung der Schleife ist so, dass pro Durchlauf ein Muster erkannt wird und im Rumpf der Schleife aus diesem gefundenen String ein MatchResult wird, welches die Funddaten aufnimmt. Diese Objekte werden in einer Liste gesammelt und unter der Sicht eines Iterable zurückgegeben.

Ein paar Programmzeilen zeigen schnell die Möglichkeiten. Ein einfaches Muster soll für ISBN-Nummern stehen – ohne Leerzeichen oder Bindestriche.

Listing 4.5   MatchResultDemo.java, Teil 2

String pattern = "\\d{9,10}[\\d|x]";
String s = "Insel: 3898425266, Reguläre Ausdrücke: 3897213494";
for ( MatchResult r : findMatches( patterns ) )
  System.out.println( r.group() + " von " + r.start() + " bis " + r.end() );

Das Ergebnis auf der Konsole ist:

3898425266 von 7 bis 17
3897213494 von 39 bis 49

Die Informationen in einem MatchResult entsprechen also einem Zustand eines Matchers während des Parsens, genauer gesagt nach dem Erkennen einer Zeichenfolge. Daher implementiert auch die Klasse Matcher die Schnittstelle MatchResult.


Galileo Computing

4.4.3 Das alternative Paket org.apache.regexp  toptop

Das org.apache.regexp-Paket ist eine Java-Implementierung der klassischen Bibliothek für reguläre Ausdrücke auf der Basis endlicher Automaten unter der BSD-Lizenz. Das Paket lässt sich unter http://jakarta.apache.org/regexp/ laden. Das Paket enthält wie üblich den kompletten Quellcode.

 << zurück




Copyright © Galileo Press GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> 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.


[Galileo Computing]

Galileo Press GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de