Regular Expressions

Martin Kompf

Regex Tester

Reguläre Ausdrücke (engl.: Regular Expressions, Abk.: regex) sind ein mächtiges Werkzeug zur Verarbeitung von Zeichenketten. In der Programmiersprache Java sind Regular Expressions seit Version 1.4 fest eingebaut. Diese Seite enthält eine Regex Kurzreferenz und einen Regex Tester zum interaktiven Testen von Regulären Ausdrücken.

Regex Tester

Starte Regex Tester Der Regex Tester ist ein Java Programm zum interaktiven Entwickeln und Testen von Regular Expressions. Sie starten das Tool mittels Java Webstart durch Klick auf den Launch Button. Voraussetzung ist das Vorhandensein einer Java Laufzeitumgebung auf Ihrem Computer.

Neuere Versionen von Java Webstart erschweren oder verbieten die Ausführung unsignierter Anwendungen, selbst wenn diese komplett in der Sandbox laufen. In diesem Fall können Sie das Programm manuell downloaden und per Kommandozeile java -jar regexGUI.jar ausführen.

Die Signatur lässt sich mittels gpg --verify regexGUI.jar.sig.asc regexGUI.jar und meinem öffentlichen PGP-Key überprüfen.

Regex Kurzreferenz

Zeichen

x      Das Zeichen x
\\     Backslash
\xhh   Zeichen mit Hexadezimalwert hh
\uhhhh Unicodezeichen mit Hexcode hhhhh
\t     Tabulator
\n     Newline (LF)
\r     Carriage return (CR)

Zeichenklassen

[abc]    a oder b oder c
[^abc]   Alles außer a, b oder c
[A-Z]    Alle Zeichen von A bis Z
[A-Za-z] A bis Z oder a bis z
[a-z&&[^mn]] a bis z außer m und n

Vordefinierte Zeichenklassen

.   Beliebiges Zeichen
\d  Alle Ziffern: [0-9]
\D  Alles außer Ziffern
\s  Whitespace: [ \t\n\x08\x0c\r]
\S  Negierung von \s
\w  Wortzeichen: [a-zA-Z_0-9]
\W  Negierung von \w

POSIX Zeichenklassen

\p{Lower}  ASCII Kleinbuchstabe: [a-z]
\p{Upper}  ASCII Großbuchstabe: [A-Z]
\p{ASCII}  ASCII Zeichen: [\x00-\x7f]
\p{Alpha}  Buchstabe: [A-Za-z]
\p{Digit}  Ziffer: \d
\p{Alnum}  Buchstabe oder Ziffer

Unicode Zeichenklassen

\p{Lu}  Unicode Großbuchstabe
\p{Ll}  Unicode Kleinbuchstabe
\p{Sc}  Unicode Währungssymbol
\p{Nl}  Unicode Zahl oder Buchstabe

Grenzen

^   Zeilenanfang
$   Zeilenende
\b  Wortgrenze
\A  Anfang der Eingabe
\z  Ende der Eingabe

Wiederholungen

?      einmal oder gar nicht
*      mehrmals oder gar nicht
+      mindestens einmal
{n}    exakt n-mal
{n,}   mindestens n-mal
{n,m}  n- bis m-mal

Logische Operatoren

XY   X gefolgt von Y
X|Y  X oder Y
(X)  X als Gruppe

Flags

(?i)   Case-insensitive (ASCII)
(?iu)  Case-insensitive (Unicode)
(?m)   Multi-line mode
(?s)   Single-line / dotall mode

Anwendungsmuster von Regular Expressions in Java

Matches und LookingAt

String str = "X";
String regex = "[A-Z]"; 
// Test auf Großbuchstabe (ASCII)
boolean matches = str.matches(regex);

// Alternative: pre-compiled pattern
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
matches = matcher.matches();

// LookingAt
matcher = pattern.matcher("Hallo");
matches = matcher.matches(); // false
startsWith = matcher.lookingAt(); // true

Group

String str = "17-25";
String regex = "(\\d+)-(\\d+)";
// Backslash im Java Sourcecode verdoppeln!
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
if (matcher.matches()) {
  System.out.printf("Von %s bis %s\n", 
    matcher.group(1), matcher.group(2));
}

Split

String str = "1,2, 3, 4,   5,6";
String regex = "\\W+";
// Aufteilen an Wortgrenzen
String[] elements = str.split(regex);

// Alternative: pre-compiled pattern
Pattern pattern = Pattern.compile(regex);
elements = pattern.split(str);

Find

String str = "Alle RDBMS benutzen SQL";
String regex = "\\p{Lu}{2,}";
// Finde all Wörter mit mindestens zwei 
// Großbuchstaben (Unicode)
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
  System.out.println(str.substring(
    matcher.start(), matcher.end()));
}

Replace

String str = "value  with spaces";
String regex = "\\s+";
String replacement = "+";
// Ersetze whitespace mit +
String no_spaces = 
  str.replaceAll(regex, replacement);

// Alternative: pre-compiled pattern
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
no_spaces = matcher.replaceAll(replacement);

Find and Replace

String str = "Hallo ${user.name}!";
String regex = "\\$\\{([a-z.]+)\\}";
// Ersetze ${name} mit System.getProperty(name)
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
  matcher.appendReplacement(sb, 
    System.getProperty(matcher.group(1)));
}
matcher.appendTail(sb);
System.out.println(sb.toString());