W3docs

Wie man in Java prüft, ob ein String einen Substring enthält

Substring in einem Java-String prüfen mit contains, indexOf, startsWith, endsWith und regulären Ausdrücken.

Zu prüfen, ob ein String in einem anderen vorkommt, gehört zu den häufigsten Textoperationen in Java. Das richtige Werkzeug hängt davon ab, was genau benötigt wird: ein einfaches Ja/Nein, die Position des Treffers, eine Überprüfung am Anfang oder Ende des Strings oder ein flexibles Muster. Dieses Kapitel stellt jeden idiomatischen Ansatz vor und erklärt, wann er sinnvoll ist.

Standard: String.contains

Wenn nur ein boolean benötigt wird — „ist dieser Teil darin enthalten oder nicht?" — ist contains die klarste Wahl:

String text = "The quick brown fox";
boolean hasFox = text.contains("fox");   // true
boolean hasCat = text.contains("cat");   // false

contains akzeptiert jede CharSequence (also String, StringBuilder usw.) und gibt true zurück, wenn das Argument irgendwo im String vorkommt. Die Methode ist case-sensitive: text.contains("FOX") ergibt false. Ein Sonderfall, den man kennen sollte: Der leere String ist in jedem String enthalten, daher ergibt text.contains("") immer true.

Wenn die Position gebraucht wird: indexOf

contains ist intern über indexOf implementiert. Wenn bekannt sein muss, wo ein Treffer beginnt (oder wenn nach Wiederholungen gesucht werden soll), ruft man indexOf direkt auf:

String text = "The quick brown fox";
int at = text.indexOf("brown");   // 10
int no = text.indexOf("bird");    // -1

indexOf gibt den nullbasierten Index des ersten Treffers zurück oder -1, wenn der Substring nicht vorhanden ist. Die klassische Mitgliedschaftsprüfung lautet text.indexOf("brown") >= 0, was äquivalent zu contains ist, aber gleichzeitig die Position liefert. Außerdem gibt es lastIndexOf für die Suche vom Ende aus sowie eine Überladung mit einem Start-Offset, um in einer Schleife weitere Treffer zu finden.

Verankertes Prüfen: startsWith und endsWith

Wenn es speziell auf den Anfang oder das Ende eines Strings ankommt — Dateiendungen, URL-Präfixe, Protokollschemata — drücken startsWith und endsWith die Absicht direkt aus und sind lesbarer als Substring-Operationen:

String file = "report.pdf";
boolean isPdf  = file.endsWith(".pdf");      // true
boolean isHttp = "https://w3docs.com".startsWith("https://"); // true

Diese Methoden sind schneller und klarer als indexOf(prefix) == 0, weil sie den Vergleich abbrechen, sobald ein Zeichen abweicht, und nie den gesamten String durchsuchen.

Groß-/Kleinschreibung ignorieren und Mustervergleich

contains hat keine Überladung für die Groß-/Kleinschreibung. Die einfachste Lösung ist, beide Seiten zu normalisieren:

boolean ci = text.toLowerCase().contains("FOX".toLowerCase()); // true

Für mehr als ein wörtliches Fragment — Alternativen, Wildcards, Wortgrenzen — verwendet man einen regulären Ausdruck. Pattern.compile(...).matcher(text).find() gibt true zurück, wenn das Muster irgendwo passt, und CASE_INSENSITIVE behandelt die Groß-/Kleinschreibung ohne zusätzliche Kopien in Kleinbuchstaben:

import java.util.regex.Pattern;
boolean found = Pattern.compile("fox", Pattern.CASE_INSENSITIVE)
                       .matcher(text).find();
AnsatzRückgabeEinsatz
containsbooleanEinfache Mitgliedschaft, wörtlicher Text
indexOfint (Position oder -1)Wenn bekannt sein muss, wo der Treffer ist
startsWith / endsWithbooleanVerankert am Anfang oder Ende
Pattern.findbooleanMuster, Alternativen, Groß-/Kleinschreibung ignorieren

Ein praktisches Beispiel

Dieses Programm wendet alle vier Ansätze auf einen Satz an, einschließlich der Feinheit bei der Groß-/Kleinschreibung und des Sonderfalls mit dem leeren String.

java— editable, runs on the server

Was die Ausgabe zeigt:

  • contains "brown" gibt true aus und contains "cat" gibt false aus — contains ist der direkte boolean-Mitgliedschaftstest für wörtlichen Text.
  • contains "FOX" gibt false aus, obwohl das Wort „fox" vorhanden ist — das belegt, dass contains case-sensitive ist; die normalisierte Zeile contains "FOX" (ci) gibt true aus.
  • indexOf "fox" gibt 16 aus, den nullbasierten Startindex des Treffers, während indexOf "bird" -1 ausgibt als Signal für „nicht gefunden" — dieses -1 ist der Sentinel-Wert, gegen den man prüft.
  • startsWith "The" und endsWith "dog" geben beide true aus und zeigen die verankerten Prüfungen am Anfang und Ende des Satzes.
  • contains "" gibt true aus als Erinnerung daran, dass jeder String den leeren String enthält — bei leeren Eingaben absichern, wenn das ein Fehler wäre.

Verwandte Themen

Übungen

Übung
Was gibt text.indexOf('bird') zurück, wenn 'bird' im String text nicht vorhanden ist?
Was gibt text.indexOf('bird') zurück, wenn 'bird' im String text nicht vorhanden ist?
Was this page helpful?