Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
gp Kapitel 4 Der Umgang mit Zeichenketten
gp 4.1 Strings und deren Anwendung
gp 4.1.1 String-Objekte für konstante Zeichenketten
gp 4.1.2 String-Länge
gp 4.1.3 Gut, dass wir verglichen haben
gp 4.1.4 String-Teile extrahieren
gp 4.1.5 Suchen und Ersetzen
gp 4.1.6 Veränderte Strings liefern
gp 4.1.7 Typen in Zeichenketten konvertieren
gp 4.2 Veränderbare Zeichenketten mit der Klasse StringBuffer
gp 4.2.1 Anlegen von StringBuffer-Objekten
gp 4.2.2 Die Länge eines StringBuffer-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
gp 4.3.2 Sollte es ein equals() und hash() bei StringBuffer geben?
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 Zeichenkodierungen umwandeln
gp 4.5 Die Klasse StringTokenizer
gp 4.6 Der BreakIterator als Wort- und Satztrenner
gp 4.7 Formatieren mit Format-Objekten
gp 4.7.1 Prozente, Zahlen und Währungen ausgeben
gp 4.7.2 Ausgaben formatieren
gp 4.7.3 Dezimalzahlformatierung
gp 4.8 Reguläre Ausdrücke
gp 4.8.1 Splitten von Zeichenketten
gp 4.8.2 split() in String
gp 4.8.3 Das alternative Paket org.apache.regexp


Galileo Computing

4.8 Reguläre Ausdrückedowntop

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 leicht die Funktionalität von Dienstprogrammen wie awk, sed, emacs, perl oder grep nachbilden.

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:


class java.util.regex.Pattern

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.
gp String[] split( CharSequence input )
Spaltet die Eingabesequenz auf.
gp String[] split( CharSequence input, int limit )
Spaltet die Eingabesequenz auf, liefert jedoch maximal begrenzt viele Teilzeichenfolgen.

Einige Methoden sind lediglich Abkürzungen. So macht der statische Aufruf Pattern. matches() nichts anderes, als ein Pattern zu compilieren:

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

Galileo Computing

4.8.1 Splitten von Zeichenkettendowntop

Mit der Funktion split() aus Pattern oder String kann eine Trennfolge definiert werden, die eine Zeichenkette in Teilzeichenketten zerlegt, ähnlich wie es der StringTokenizer macht. Der StringTokenizer ist jedoch beschränkt auf einzelne Zeichen als Trennsymbole, während die Methode split() einen regulären Ausdruck zur Beschreibung der Trennsymbole verwendet:


class java.util.regex.Pattern

gp String[] split( CharSequence input )
Zerlegt die Zeichenfolge input in Teilzeichenketten, wie es das aktuelle Pattern-Objekt befiehlt.
gp String[] split( CharSequence input, int limit )
Wie split(CharSequence), nur durch limit begrenzt viele Teilzeichenketten.

Beispiel Datumsformate sollen in der Reihenfolge Tag, Monat, Jahr eingegeben werden. Die Trennzeichen sollen jedoch entweder Punkt, Minus oder Slash sein. Damit lässt sich ein Pattern aufbauen, das folgendes Format hat:
Pattern p = Pattern.compile( "[/.-]" );
In diesem Fall funktioniert dies auch noch mit new StringTokenizer(...,"/.-"), doch längere Trennsymbole wie := oder :: würden mit StringTokenizer nicht mehr funktionieren.

An die split()-Funktion übergeben wir als Parameter die Zeichenkette, die zerlegt werden soll. Werfen wir einen Blick auf ein Beispiel, welches die Felder in der Methode date() ausgibt:

Listing 4.8 SplitDemo.java

import java.util.regex.*;
public class SplitDemo
{
  public static void date( String fields[] )
  {
    for ( int i = 0; i < fields.length; i++ )
      System.out.print( fields[i] + " " );
    System.out.println();
  }
  public static void main( String args[] )
  {
    Pattern p = Pattern.compile( "[/.-]" );
    date( p.split( "12-3-1973" ) );
    date( p.split( "12.3.1973" ) );
    date( p.split( "12/3/1973" ) );
  }
}

Galileo Computing

4.8.2 split() in Stringdowntop

In der String-Klasse gibt es auch die Funktion split(). Sie ist eine Objektmethode, die die aktuelle Zeichenkette, die das String-Objekt repräsentiert, zerlegt. Diese Methode benötigt jetzt umgekehrt den regulären Ausdruck als Parameter. Die Implementierung delegiert jedoch die eigentliche Arbeit an das Pattern-Objekt:

public String[] split( String regex, int limit )
{
  return Pattern.compile( regex ).split( this, limit );
}
public String[] split( String regex )
{
  return split( regex, 0 );
}

class java.lang.String
implements CharSequence, Serializable

gp String[] split( String regex )
Zerlegt die aktuelle Zeichenkette mit dem regulären Ausdruck.
gp String[] split( String regex, int limit )
Zerlegt die aktuelle Zeichenkette mit dem regulären Ausdruck, liefert jedoch maximal begrenzt viele Teilzeichenfolgen.

Galileo Computing

4.8.3 Das alternative Paket org.apache.regexptoptop

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.





Copyright (c) Galileo Press GmbH 2004
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, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de