---
title: 'Inselupdate: Suchen und Ersetzen mit Mustern'
url: 'https://www.tutego.de/blog/javainsel/2015/05/inselupdate-suchen-und-ersetzen-mit-mustern'
markdown: 'https://www.tutego.de/blog/javainsel/2015/05/inselupdate-suchen-und-ersetzen-mit-mustern.md'
date: '2015-05-23'
description: 'Für den Suchfall mit Java RegEx gibt es noch eine Erweiterung, dass nämlich die Pattern-Klasse die Fundstellen nicht nur ermittelt, sondern sie auch durch etwas anderes ersetzen kann. Beispiel: In einem String sollen alle Nicht-JVM-Sprachen ausgepiept werden: String text = "Ich mag Java, Groovy und…'
taxonomy:
  category:
    - Insel
---

# Inselupdate: Suchen und Ersetzen mit Mustern

![Illustration einer tropischen Insel mit Palmen und einem hohen Berg](https://www.tutego.de/blog/javainsel/user/themes/tutego/images/insel-cover.jpg)# Java Blog für Programmierer

[Java Blog für Programmierer](https://www.tutego.de/blog/javainsel/)

## Inselupdate: Suchen und Ersetzen mit Mustern

23.05.2015 · [Christian Ullenboom](https://www.tutego.de/blog/javainsel/author/admin/)

Für den Suchfall mit Java RegEx gibt es noch eine Erweiterung, dass nämlich die Pattern-Klasse die Fundstellen nicht nur ermittelt, sondern sie auch durch etwas anderes ersetzen kann.

Beispiel: In einem `String` sollen alle Nicht-JVM-Sprachen ausgepiept werden:

```java
String text = "Ich mag Java, Groovy und ObjectiveC und PHP.";
Matcher matcher = Pattern.compile("ObjectiveC|PHP" ).matcher( text );
StringBuffer sb = new StringBuffer();
while ( matcher.find() )
matcher.appendReplacement( sb, "[PIEP]" );
matcher.appendTail( sb );
```

`System.out.println( sb )`; // Ich mag Java, Groovy und \[PIEP\] und \[PIEP\].

Um mit dem Mechanismus „Suchen und Ersetzen“ zu arbeiten, wird zunächst ein Container vom Typ `StringBuffer` aufgebaut, denn in dem echten `String` kann Pattern die Fundstellen nicht ersetzen. (Leider ist ein `StringBuffer` nötig, die API akzeptiert keinen `StringBuilder`.) Erkennt der `Matcher` ein Muster, macht `appendReplacement(…)` zwei Dinge:

1\. Die Methode füllt den Container mit allen Zeichen vom letzten Fund bis zur jetzigen Fundstelle auf. Beim ersten Aufruf ist das „Ich mag Java, Groovy und “, dann folgt „ und “.

2\. In den `StringBuffer` können wir unsere Ersetzung, in diesem Falle „\[PIEP\]“, setzen.

So wächst der `StringBuffer` von Schritt zu Schritt. Nach der letzten Fundstelle setzt `appendTail(…)` das noch verbleibende Teilstück von der letzten Funstelle bis zum Stringende in den `StringBuffer`-Container.

Im Prinzip können wir in der while-Schleife mit `matcher.group(…)` auf das Fundstück zurückgreifen und es in die Ersetzung einbauen. Doch toll an `appendReplacement(…)` ist, dass der Ersetzungsstring ein $ enthalten darf – mit dem Problem, dass ein vorkommendes Dollar-Zeichen ausmaskiert werden muss –, der Zugriff auf die Suchgruppe bietet. Damit lassen sich sehr elegante Lösungen bauen. Nehmen wir an, wir müssen in einer Zeichenkette alle URLs in HTML-Hyperlinks konvertieren. Dann rahmen wir einfach jede Fundstelle in die nötigen HTML-Tags ein. In Quellcode sieht das so aus:

Listing 2.7: RegExSearchAndReplace.java, `main()`

`String` text = „Hi, schau mal bei <http://stackoverflow.com/> “ + „oder <http://www.tutego.de/> vorbei.“; `String` regex = „[http://\\\[a-zA-Z0-9\\\\\\\\\\\\\\\]+\\\\\\\\.\\\[a-zA-Z\\\]{2,3}(\\\\\\\\S](http://%5C%5Ba-zA-Z0-9%5C%5C%5C%5C%5C%5C%5C%5D+%5C%5C%5C%5C.%5C%5Ba-zA-Z%5C%5D%7B2,3%7D(%5C%5C%5C%5CS)\*)?“;

```java
Matcher matcher = Pattern.compile( regex ).matcher( text );
StringBuffer sb = new StringBuffer( text.length() );
while ( matcher.find() )
 matcher.appendReplacement( sb, "<a href=\\"$0\\">$0</a>" );
matcher.appendTail( sb );
System.out.println( sb );
```

Der `StringBuffer` enthält dann zum Schluss „Hi, schau mal bei <a href=“[http://stackoverflow.com/“&gt;http://stackoverflow.com/&lt;/a&gt](http://stackoverflow.com/%E2%80%9C&gt;http://stackoverflow.com/&lt;/a&gt); oder <a href=“[http://www.tutego.de/“&gt;http://www.tutego.de/&lt;/a&gt](http://www.tutego.de/%E2%80%9C&gt;http://www.tutego.de/&lt;/a&gt); vorbei.“. (Der gewählte reguläre Ausdruck für URLs ist kurz, aber nicht vollständig. Für das Beispiel spielt das aber keine Rolle.)

Tipp: Die `String`-Methoden `replaceAll(…)` und `replaceFirst(…)` ersetzen direkt, und arbeiten im Hintergrund genauso. Zum Einsatz kommt die `replaceAll(.,.)`-Methode vom `Matcher`.

Hinweis: Der Ersetzungsausdruck „<a href=\\“$0\\“>$0</a>“ enthält mit $ Steuerzeichen für den `Matcher`. Wenn die Ersetzung aber überhaupt nicht mit $n auf das gefundene Wort zurückgreift, sollten die beiden Sonderzeichen \\ und $ ausmaskiert werden. Auf diese Weise werden merkwürdige Fehler vermieden, wenn doch in der Ersetzung ein Dollar-Zeichen oder ein Backslash vorkommt. Das Ausmaskieren übernimmt die Methode `quoteReplacement(…)`, sodass sich zum Beispiel Folgendes ergibt:

```java
matcher.appendReplacement( sb, Matcher.quoteReplacement( replacement ) );
```

Kategorien: [Insel](https://www.tutego.de/blog/javainsel/category/insel/)

[← Alle Beiträge](https://www.tutego.de/blog/javainsel/)

---

## Navigation

- Previous: [Java Open Source Bibliotheken Mai](https://www.tutego.de/blog/javainsel/2015/05/java-open-source-bibliotheken-mai.md)
- Next: [Töröööö, Java ist 20 Jahre alt …](https://www.tutego.de/blog/javainsel/2015/05/tr-java-ist-20-jahre-alt.md)
