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"); // falsecontains 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"); // -1indexOf 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://"); // trueDiese 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()); // trueFü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();| Ansatz | Rückgabe | Einsatz |
|---|---|---|
contains | boolean | Einfache Mitgliedschaft, wörtlicher Text |
indexOf | int (Position oder -1) | Wenn bekannt sein muss, wo der Treffer ist |
startsWith / endsWith | boolean | Verankert am Anfang oder Ende |
Pattern.find | boolean | Muster, 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.
Was die Ausgabe zeigt:
contains "brown"gibttrueaus undcontains "cat"gibtfalseaus —containsist der direkte boolean-Mitgliedschaftstest für wörtlichen Text.contains "FOX"gibtfalseaus, obwohl das Wort „fox" vorhanden ist — das belegt, dasscontainscase-sensitive ist; die normalisierte Zeilecontains "FOX" (ci)gibttrueaus.indexOf "fox"gibt16aus, den nullbasierten Startindex des Treffers, währendindexOf "bird"-1ausgibt als Signal für „nicht gefunden" — dieses-1ist der Sentinel-Wert, gegen den man prüft.startsWith "The"undendsWith "dog"geben beidetrueaus und zeigen die verankerten Prüfungen am Anfang und Ende des Satzes.contains ""gibttrueaus als Erinnerung daran, dass jeder String den leeren String enthält — bei leeren Eingaben absichern, wenn das ein Fehler wäre.
Verwandte Themen
- Java Strings — die Grundlage für jede Methode auf dieser Seite.
- Java String Methods — die vollständige Referenz für
contains,indexOf,startsWithund weitere Methoden. - How to Compare Strings in Java — Gleichheit und Reihenfolge, die natürliche Fortsetzung nach der Mitgliedschaftsprüfung.
- Java Regex: Pattern and Matcher — vertiefende Informationen zum musterbasieren Ansatz aus diesem Kapitel.