Sprachen

Regex in verschiedenen Programmiersprachen: JavaScript, Python, PHP & Java im Vergleich

Reguläre Ausdrücke verhalten sich je nach Sprache unterschiedlich. Der Vergleich von JavaScript, Python, PHP und Java zeigt Engines, Syntax und Stolperfallen.

Lesezeit 7 Min. Aktualisiert 08.06.2026 4 Quellen Jan-Tristan Rudat Jan-Tristan Rudat
Inhalt

Ein regulärer Ausdruck sieht in jeder Programmiersprache fast gleich aus, verhält sich aber selten exakt identisch. Wer ein Muster aus einem Tutorial kopiert und in die falsche Engine wirft, bekommt im besten Fall eine Fehlermeldung und im schlimmsten Fall ein stilles Fehlverhalten. Dieser Vergleich zeigt, worin sich JavaScript, Python, PHP und Java unterscheiden und wo die echten Fallstricke liegen.

Warum dieselbe Regex unterschiedlich reagiert

Reguläre Ausdrücke sind keine eingebaute Magie, sondern werden von einer sogenannten Engine ausgewertet. Diese Engine ist eine Software-Bibliothek, die das Muster interpretiert und gegen einen Text laufen lässt. Verschiedene Sprachen liefern verschiedene Engines mit, und genau hier entstehen die Unterschiede. Manche Engines kennen Funktionen, die andere nicht haben, und manche behandeln Randfälle leicht abweichend.

Die zwei wichtigsten Familien sind ECMAScript, der Standard hinter JavaScript, und PCRE, was für Perl Compatible Regular Expressions steht. PCRE ist besonders mächtig und wird unter anderem von PHP genutzt. Python und Java bringen jeweils eigene Implementierungen mit, die sich grob an Perl orientieren, aber eigene Eigenheiten haben. Wenn die Grundlagen noch wackeln, lohnt vorab ein Blick in den Ratgeber Was sind reguläre Ausdrücke?.

JavaScript: die Engine im Browser und in Node

In JavaScript erzeugt man ein Muster entweder als Literal zwischen zwei Schrägstrichen oder über das Objekt RegExp. Ein einfaches Muster für eine Ziffernfolge sieht so aus:

const muster = /\d{3,5}/g;
const treffer = "Code 4711".match(muster);

Das Flag am Ende, hier das g für global, steuert das Verhalten über mehrere Treffer. JavaScript kennt die üblichen Flags g, i, m und s sowie das u für Unicode. Benannte Gruppen schreibt man mit Fragezeichen und spitzen Klammern um den Namen. Lookbehind wird von modernen Engines unterstützt. Eine ausführliche Einführung in die JavaScript-Variante steht in der Anleitung für JavaScript.

Der entscheidende Vorteil von JavaScript für das schnelle Ausprobieren: Der Regex-Tester auf dieser Seite läuft direkt mit der JavaScript-Engine des Browsers. Was hier funktioniert, funktioniert auch in jeder Node- oder Browser-Anwendung identisch.

Python: Raw-Strings und das re-Modul

Python bringt das Modul re mit, das man importieren muss. Ein Muster ist in Python ein normaler String, und genau hier lauert die erste Falle. Schreibt man einen Backslash in einen normalen String, versucht Python diesen als Escape zu deuten. Deshalb nutzt man bei Regex fast immer einen Raw-String mit einem r vor dem Anführungszeichen:

import re

muster = re.compile(r"\d{3,5}")
treffer = muster.findall("Code 4711")

Ohne das r-Präfix müsste man jeden Backslash verdoppeln. Benannte Gruppen schreibt Python anders als der Rest der Welt, nämlich mit Fragezeichen, einem großen P und spitzen Klammern um den Namen, etwa (?P<jahr>\d{4}). Wer ein Muster aus JavaScript übernimmt, muss diese Schreibweise anpassen. Die Details stehen in der Anleitung für Python.

PHP: PCRE und der Delimiter

PHP wertet Regex über die PCRE-Funktionen aus, allen voran preg_match und preg_replace. Eine Besonderheit fällt sofort auf: Das Muster wird in PHP von Begrenzungszeichen umschlossen, den sogenannten Delimitern. Üblich ist der Schrägstrich, aber jedes nicht-alphanumerische Zeichen ist erlaubt:

$treffer = preg_match('/\d{3,5}/', 'Code 4711', $matches);

Die Flags stehen bei PHP nicht in einem separaten Argument, sondern direkt hinter dem schließenden Delimiter. Ein i für Groß- und Kleinschreibung würde also als /muster/i notiert. Das ist gewöhnungsbedürftig, wenn man von JavaScript kommt. Da PHP-Muster ebenfalls in einfachen Anführungszeichen stehen, bleibt das Maskieren hier vergleichsweise entspannt. Mehr dazu in der Anleitung für PHP.

Der Delimiter in PHP ist kein Teil des Musters, sondern eine Verpackung. Wer ihn vergisst, bekommt sofort eine Warnung statt eines stillen Fehlers.

Java: doppeltes Maskieren als Dauerthema

Java arbeitet mit den Klassen Pattern und Matcher. Man kompiliert zuerst ein Pattern und erzeugt daraus einen Matcher für einen konkreten Text. Das eigentliche Problem in Java ist das Maskieren. Da das Muster ein String ist und der Backslash dort bereits Escape-Zeichen ist, muss jeder Regex-Backslash doppelt geschrieben werden:

Pattern p = Pattern.compile("\\d{3,5}");
Matcher m = p.matcher("Code 4711");
boolean gefunden = m.find();

Aus dem einfachen Muster Backslash d wird im Java-Quelltext doppelter Backslash gefolgt von d. Bei längeren Mustern mit vielen Sonderzeichen wächst die Zahl der Backslashes schnell und das Muster wird schwer lesbar. Genau deshalb testet man Java-Muster am besten erst in einem Tester, wo nur ein Backslash steht, und verdoppelt sie dann beim Übertragen in den Quelltext.

Tabelle: Aufruf und Besonderheit je Sprache

Die folgende Übersicht fasst zusammen, wie ein Muster in jeder Sprache angewendet wird und worauf besonders zu achten ist.

SpracheTypischer AufrufBesonderheit
JavaScripttext.match(/muster/g) oder new RegExpECMAScript-Engine, Literal mit Schrägstrichen, Flags am Ende
Pythonre.compile(r"muster")Raw-String empfohlen, benannte Gruppen mit Fragezeichen, P und Name
PHPpreg_match('/muster/', $text)PCRE-Engine, Muster mit Delimitern, Flags hinter dem Delimiter
JavaPattern.compile("muster")Backslash im String verdoppeln, Trennung in Pattern und Matcher

Flags: gleiche Idee, andere Schreibweise

Flags steuern, wie ein Muster ausgewertet wird, etwa ob Groß- und Kleinschreibung egal ist oder ob ein Muster über mehrere Zeilen greift. Die Buchstaben sind weitgehend identisch, aber der Ort, an dem sie stehen, unterscheidet sich. In JavaScript hängen die Flags direkt hinter dem schließenden Schrägstrich des Literals. In PHP stehen sie ebenfalls hinter dem Delimiter, sind also Teil des Muster-Strings. Python und Java übergeben Flags dagegen als separates Argument oder als Konstante an die Kompilierfunktion.

Ein konkretes Beispiel: Das i für Groß- und Kleinschreibung notiert man in JavaScript als /muster/i, in PHP genauso, in Python aber als zusätzliches Argument re.IGNORECASE und in Java als Konstante Pattern.CASE_INSENSITIVE. Inhaltlich passiert dasselbe, nur die Verpackung wechselt. Wer ein Muster portiert, muss die Flags daher aus dem Literal herauslösen und an die richtige Stelle der Zielsprache setzen.

Dieselbe Logik testen, bevor sie portiert wird

Bei größeren Projekten lohnt ein fester Ablauf. Man entwickelt das Muster zunächst dort, wo das Feedback am schnellsten kommt, also im Regex-Tester im Browser. Erst wenn das Muster gegen echte und gegen bewusst falsche Beispiele sauber arbeitet, überträgt man es in die Zielsprache. Dabei werden drei Dinge angepasst: das Maskieren, die Schreibweise eventuell benannter Gruppen und die Position der Flags. Dieser Dreischritt verhindert, dass ein an sich korrektes Muster an einer reinen Verpackungsfrage scheitert.

Gerade in Teams, die mehrere Sprachen parallel pflegen, zahlt sich diese Disziplin aus. Ein Muster, das im Tester dokumentiert und mit Beispielen versehen ist, lässt sich von jedem Teammitglied nachvollziehen und in die jeweilige Sprache übertragen, ohne dass jeder bei null anfängt. Die JavaScript-Variante als gemeinsamer Nenner ist dabei praktisch, weil sie ohne doppeltes Maskieren auskommt und damit am besten lesbar bleibt.

Lookbehind, Unicode und andere Unterschiede

Über die Aufruf-Syntax hinaus unterscheiden sich die Engines bei den Funktionen. Lookbehind, also das Prüfen eines Musters hinter der aktuellen Position, war in JavaScript lange nicht verfügbar und ist erst in neueren Engines verlässlich. PHP und Python kennen es seit Langem, Java ebenfalls. Bei Unicode-Eigenschaften, etwa dem Filtern nach Buchstaben einer bestimmten Schrift, sind die Schreibweisen uneinheitlich, und nicht jede Engine unterstützt dieselben Eigenschaftsnamen.

Die mit Abstand häufigste Stolperfalle bleibt das Maskieren in String-Literalen. JavaScript-Literale mit Schrägstrichen und PHP-Strings in einfachen Anführungszeichen sind hier am gutmütigsten, Python verlangt den Raw-String und Java das konsequente Verdoppeln. Wer diese drei Eigenheiten im Kopf hat, vermeidet die meisten Frustmomente. Weitere typische Fehlerquellen behandelt der Ratgeber Häufige Regex-Fehler vermeiden, und konkrete Muster für den Alltag liefert der Beitrag zu häufigen Regex-Mustern.

Was beim Sprachwechsel bleibt

Die gute Nachricht zum Schluss: Das logische Denken hinter regulären Ausdrücken bleibt über alle Sprachen hinweg gleich. Zeichenklassen, Quantoren, Anker und Gruppen funktionieren überall nach demselben Prinzip. Wer das Konzept einmal verstanden hat, muss beim Sprachwechsel nur die Verpackung lernen, also Aufruf, Maskieren und ein paar Syntax-Eigenheiten. Den eigentlichen Ausdruck testet man am schnellsten hier im Browser und überträgt ihn dann mit Blick auf die Eigenheiten der Zielsprache.

Häufige Fragen

Funktioniert mein Regex in jeder Programmiersprache gleich?

Nein. Die grundlegende Syntax ist ähnlich, aber Engines unterscheiden sich bei Lookbehind, benannten Gruppen, Unicode-Eigenschaften und beim Maskieren in String-Literalen. Ein in JavaScript getestetes Muster sollte vor dem Einsatz in Python, PHP oder Java gegengeprüft werden.

Welche Regex-Engine nutzt der Tester auf regextester.de?

Der Tester nutzt die JavaScript-Engine des Browsers, also ECMAScript. Muster verhalten sich exakt so, wie sie auch in einer Node.js- oder Browser-Umgebung laufen würden. Für PCRE- oder Java-spezifische Features ist eine Kontrolle in der Zielsprache nötig.

Warum muss ich in Java jeden Backslash doppelt schreiben?

In Java ist ein regulärer Ausdruck ein normaler String. Der Backslash ist dort bereits ein Escape-Zeichen, deshalb braucht ein Regex-Backslash zwei davon. Aus dem Muster Backslash d wird im Java-Quelltext also doppelter Backslash gefolgt von d.

Wie schreibe ich benannte Gruppen in Python?

Python nutzt die Syntax mit Fragezeichen, P und spitzen Klammern um den Namen, gefolgt vom Muster. JavaScript und Java verwenden dagegen nur Fragezeichen und spitze Klammern ohne das P. Wer Muster portiert, muss diese Schreibweise anpassen.

Was sind Raw-Strings in Python und wann brauche ich sie?

Raw-Strings sind String-Literale mit einem r-Präfix, in denen der Backslash nicht als Escape interpretiert wird. Bei Regex sind sie praktisch Pflicht, sonst muss jeder Backslash doppelt geschrieben werden und das Muster wird unleserlich.

Quellen

Jan-Tristan Rudat

Über die Autorenschaft

Jan-Tristan Rudat

Redakteur regextester.de

Themengebiet: Regex in Programmiersprachen, Werkzeuge und Engines

Mehr über Jan-Tristan Rudat →

Verwandte Artikel

Regex live testen

Muster und Testtext eingeben, Treffer erscheinen sofort, ohne Anmeldung.

Zum Tester
Anzeige
Anzeige
Anzeige
Anzeige