Dies ist eine Referenzseite – Sie müssen sie nicht unbedingt lesen, denn sie ist recht knapp gehalten. In anderen Abschnitten wird bei Bedarf darauf verwiesen.
Regex-Modifikatoren tauchen auf dieser Website an jeder Ecke auf. Anstatt immer wieder zu erklären, was sie tun und wie man sie in jeder Regex-Variante aktivieren kann, habe ich beschlossen, die vier häufigsten (i, s, m und x) an einem Ort zusammenzufassen. Der letzte Abschnitt gibt einen kurzen Überblick über andere Modifikatoren, die normalerweise sprachspezifisch sind.
Sprungpunkte
Für eine einfache Navigation sind hier einige Sprungpunkte zu verschiedenen Abschnitten der Seite:
✽ Groß- und Kleinschreibung: i
✽ DOTALL (Dot Matches Line Breaks): s (außer Ruby und JavaScript)
✽ Multiline (^ und $ Matches on Every Line): m (außer Ruby)
✽ Free-Spacing: x (außer JavaScript)
✽ Andere Modifikatoren
✽ PCRE’s Special Start-of-Pattern Modifikatoren
(direkter Link)

Case Insensitivity: i

Standardmäßig passen alle großen Regex-Engines im Case-Sensitive-Modus. Wenn Sie möchten, dass Muster wie Name:
Ja, aber…
Was bedeutet „case-insensitive“ eigentlich?
Solange man sich an die 26 Buchstaben des englischen Alphabets hält, ist die Definition von Groß- und Kleinschreibung einfach. Wenn Sie sich mit typografischen Feinheiten oder anderen Sprachen und Schriften befassen, sind die Dinge nicht immer so einfach. Hier sind einige Fragen, auf die Sie stoßen können?
✽ Passt fl (ein Zeichen, d. h. die Ligatur fl) zu FL?
✽ Passt à (ein Zeichen) zu À?
✽ Passt à (zwei Zeichen, d. h. der Buchstabe a und der Gravis-Akzent) zu À? Alle Maschinen scheinen dies korrekt zu handhaben.
✽ Passt ß zu ss? Keine Maschine scheint das zu tun.
✽ Passt i zu İ (türkisches Groß-i) und zu I?
Diese Fragen sind nur die Spitze des Eisbergs. Selbst wenn ich alle Antworten wüsste, wäre es unmöglich, sie alle in diesem Abschnitt aufzuführen: Wenn Sie ein bestimmtes Skript verwenden, müssen Sie recherchieren, wie Ihre spezielle Engine die Groß- und Kleinschreibung in diesem Skript handhabt.
Mehr als eine Möglichkeit
Für mehrere Engines gibt es zwei Möglichkeiten, die Groß- und Kleinschreibung zu berücksichtigen: als Inline-Modifikator (?i) oder als Option in der Regex-Methode oder -Funktion.
Inline-Modifikator (?i)
In .NET, PCRE (C, PHP, R…), Perl, Python, Java und Ruby (aber nicht JavaScript) können Sie den Inline-Modifikator (?i) verwenden, zum Beispiel in (?i)cat. Im Abschnitt über Inline-Modifikatoren finden Sie pikante Details über drei zusätzliche Funktionen (die in Python nicht verfügbar sind): Einschalten in der Mitte der Zeichenkette, Ausschalten mit (?-i) oder Anwendung nur auf den Inhalt einer Nicht-Capture-Gruppe mit (?i:foo)

.NET
Neben dem Inline-Modifikator (?i) haben .NET-Sprachen die Option IgnoreCase. In C# können Sie zum Beispiel verwenden:
var catRegex = new Regex("cat", RegexOptions.IgnoreCase);
Perl
Abgesehen von dem (?i) Inline-Modifikator können Sie in Perl das i-Flag nach dem schließenden Begrenzer Ihres Musters hinzufügen. Zum Beispiel können Sie verwenden:
if ($the_subject =~ m/cat/i) { … }
PCRE (C, PHP, R…)
Beachten Sie, dass Sie in PCRE den Unicode-Modus einschalten müssen, um die Groß-/Kleinschreibung bei nicht-englischen Buchstaben, die nicht Teil Ihres Gebietsschemas sind, zu berücksichtigen – zum Beispiel mit dem (*UTF8) Start-of-Pattern-Modifikator.
Abgesehen vom (?i) Inline-Modifikator können Sie in PCRE den PCRE_CASELESS-Modus beim Aufruf der Funktion pcre_compile() (oder einer ähnlichen Funktion) setzen:

cat_regex = pcre_compile( "cat", PCRE_CASELESS, &error, &erroroffset, NULL ); 

In PHP wird die PCRE_CASELESS-Option über das i-Flag übergeben, das Sie in Ihre Regex-Zeichenkette nach dem schließenden Delimiter einfügen können. Zum Beispiel können Sie verwenden:
$cat_regex = '~cat~i';
In R wird die Option PCRE_CASELESS über die Option ignore.case=TRUE übergeben. Sie können zum Beispiel verwenden:
grep("cat", subject, perl=TRUE, value=TRUE, ignore.case=TRUE);
Python
Neben dem (?i) Inline-Modifikator verfügt Python über die Option IGNORECASE. Sie können zum Beispiel verwenden:
cat_regex = re.compile("cat", re.IGNORECASE)
Java
Abgesehen vom (?i) Inline-Modifikator hat Java die Option CASE_INSENSITIVE. Sie können zum Beispiel Folgendes verwenden:

Pattern catRegex = Pattern.compile( "cat", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE );

Die hier hinzugefügte Option UNICODE_CASE stellt sicher, dass die Groß-/Kleinschreibung nicht unterdrückt wird, sondern Unicode berücksichtigt. Wenn Sie nur mit ASCII arbeiten, brauchen Sie diese Option nicht zu verwenden.
JavaScript
In JavaScript besteht Ihre einzige Möglichkeit darin, das i-Flag nach dem schließenden Begrenzungszeichen des Musters hinzuzufügen. Zum Beispiel können Sie verwenden:
var catRegex = /cat/i;
Ruby
Neben dem (?i) Inline-Modifikator können Sie in Ruby das i-Flag nach dem schließenden Begrenzungszeichen des Musters hinzufügen. Zum Beispiel können Sie verwenden:
cat_regex = /cat/i
(direkter Link)

DOTALL (Punkt passt zu Zeilenumbrüchen): s (mit Ausnahmen)

Standardmäßig passt der Punkt . nicht zu Zeilenumbruchzeichen wie Zeilenvorschub und Wagenrücklauf. Wenn Sie möchten, dass Muster wie BEGIN .*? END zeilenübergreifend übereinstimmen sollen, müssen wir diese Funktion einschalten.

Dieser Modus wird manchmal als einzeilig bezeichnet (daher das s), weil der Punkt die gesamte Zeichenfolge in eine einzige große Zeile verwandelt – .* wird vom ersten bis zum letzten Zeichen übereinstimmen, egal wie viele Zeilenumbrüche dazwischen liegen.
Der Modus wird in PCRE, Python und Java auch DOTALL genannt (um genau zu sein, verwendet die PCRE-Dokumentation PCRE_DOTALL). Ich halte den Namen DOTALL für eine sinnvolle Bezeichnung für diesen Modus. Die dritte Option dot-matches-line-breaks ist beschreibend, aber etwas langatmig.
Für verschiedene Engines gibt es zwei Möglichkeiten, diesen Modus zu aktivieren: als Inline-Modifikator oder als Option in der Regex-Methode oder -Funktion.
JavaScript
JavaScript unterstützt keinen Einzeilenmodus. Um ein beliebiges Zeichen in JavaScript zu finden, einschließlich Zeilenumbrüche, verwenden Sie ein Konstrukt wie . Diese Zeichenklasse passt auf ein Zeichen, das entweder eine Nicht-Ziffer \D oder eine Ziffer \d ist. Daher passt sie auf jedes Zeichen.
Eine andere JavaScript-Lösung ist die Verwendung der XRegExp-Regex-Bibliothek. Wenn Sie unendlich viel Zeit haben, können Sie auch versuchen, PCRE mit Emscripten nach JavaScript zu portieren, wie es Firas auf regex 101 getan zu haben scheint.
Inline-Modifikator (?s)
In .NET, PCRE (C, PHP, R…), Perl, Python und Java (aber nicht Ruby) können Sie den Inline-Modifikator (?s) verwenden, zum Beispiel in (?s)BEGIN .*? END. Im Abschnitt über Inline-Modifikatoren finden Sie pikante Details über drei zusätzliche Funktionen (die in Python nicht verfügbar sind): Einschalten in der Mitte der Zeichenkette, Ausschalten mit (?-s) oder Anwendung nur auf den Inhalt einer Nicht-Capture-Gruppe mit (?s:foo)
.NET
Neben dem Inline-Modifikator (?s) gibt es in .NET-Sprachen die Option Singleline. In C# können Sie z. B. verwenden:

var blockRegex = new Regex( "BEGIN .*? END", RegexOptions.IgnoreCase | RegexOptions.Singleline );

Perl
Neben dem Inline-Modifikator (?s) können Sie in Perl das s-Flag nach dem abschließenden Begrenzer Ihres Musters hinzufügen. Zum Beispiel können Sie verwenden:
if ($the_subject =~ m/BEGIN .*? END/s) { … }
PCRE (C, PHP, R…)
Neben dem (?s) Inline-Modifikator können Sie in PCRE den PCRE_DOTALL-Modus beim Aufruf der Funktion pcre_compile() (oder einer ähnlichen Funktion) setzen:

block_regex = pcre_compile( "BEGIN .*? END", PCRE_DOTALL, &error, &erroroffset, NULL ); 

In PHP wird die PCRE_DOTALL-Option über das s-Flag übergeben, das Sie in Ihrem Regex-String nach dem schließenden Begrenzer hinzufügen können. Zum Beispiel können Sie verwenden:

$block_regex = '~BEGIN .*? END~s';
Python
Neben dem (?s) Inline-Modifikator verfügt Python über die Option DOTALL. Sie können zum Beispiel verwenden:
block_regex = re.compile("BEGIN .*? END", re.IGNORECASE | re.DOTALL)
Java
Abgesehen von dem (?s) Inline-Modifizierer hat Java die DOTALL-Option. Sie können zum Beispiel:

Pattern blockRegex = Pattern.compile( "BEGIN .*? END", Pattern.CASE_INSENSITIVE | Pattern.DOTALL ); 

Ruby verwenden: (?m)-Modifizierer und m-Flag
In Ruby kann man den Inline-Modifizierer (?m) verwenden, zum Beispiel in (?m)BEGIN .*? END. Das ist eine merkwürdige Ruby-Eigenheit, da andere Engines (?m) für den „^ und $-Match in jeder Zeile“-Modus verwenden.
Siehe den Abschnitt über Inline-Modifikatoren für pikante Details über drei zusätzliche Funktionen: Einschalten in der Mitte der Zeichenkette, Ausschalten mit (?-m), oder Anwendung nur auf den Inhalt einer Nicht-Capture-Gruppe mit (?m:foo)
Ruby erlaubt es auch, das m-Flag am Ende der Regex-Zeichenkette hinzuzufügen. Zum Beispiel können Sie verwenden:
block_regex = /BEGIN .*? END/m
(direkter Link)
Ursprünge von DOTALL
Der Einzeilenmodus wird auch oft DOTALL genannt (was für „dot matches all“ steht), wegen der PCRE_DOTALL Option in PCRE, der re.DOTALL Option in Python und der Pattern.DOTALL Option in Java.
Ich habe mehrmals gehört, dass „DOTALL eine Sache von Python ist“, aber das schien von Leuten zu kommen, die nichts von den entsprechenden Optionen in PCRE und Java gehört hatten. Trotzdem habe ich mich gefragt: Wo ist DOTALL zuerst aufgetaucht? Ein Blick in das PCRE Change Log und die alte Python-Dokumentation zeigt, dass es in PCRE mit Version 0.96 (Oktober 1997), in Python mit Version 1.5 (Februar 1998) und dann in Java 1.4 (Februar 2002) auftauchte. Die Lücke zwischen den Einführungen in PCRE und Python war nicht eindeutig – das Wort könnte in früheren Betaversionen oder sogar in anderen Werkzeugen im Umlauf gewesen sein – also fragte ich Philip Hazel (den Vater von PCRE) danach. Er antwortete:

Ich glaube, ich habe es erfunden – ich hatte es jedenfalls noch nirgendwo gesehen, als ich versuchte, einen Namen für die PCRE-Option zu finden, der der /s-Option von Perl entspricht. („S“ steht dort für „single-line“ (…), also wollte ich einen besseren Namen.)

So, hier. Diejenigen, die ein bisschen Geschichte mögen, werden sich vielleicht über diesen Leckerbissen freuen.
(direkter Link)

Multiline (^ and $ Match on Every Line): m (except Ruby)

Standardmäßig passen die Anker ^ und $ in allen wichtigen Engines außer Ruby nur am Anfang bzw. am Ende der Zeichenkette.

In Ruby passen sie am Anfang und am Ende jeder Zeile, und es gibt keine Möglichkeit, diese Funktion abzuschalten. Das ist eigentlich eine vernünftige Vorgehensweise, mit der Ruby sich teilweise dafür entschuldigt, dass es m für den DOTALL-Modus verwendet, während andere Engines s verwenden.
Wenn man möchte, dass Muster wie ^Define und >>>$ am Anfang bzw. am Ende jeder Zeile übereinstimmen, muss man diese Funktion in anderen Engines einschalten.
Dieses Feature wird gewöhnlich multi-line genannt (daher das m), weil die Anker ^ und $ auf mehrere Zeilen wirken.
Für verschiedene Engines gibt es zwei Möglichkeiten, es einzuschalten: als Inline-Modifikator (?m) oder als Option in der Regex-Methode oder -Funktion.
Ruby
In Ruby passen die Anker ^ und $ immer auf alle Zeilen. Es gibt keine Möglichkeit, diese Option abzuschalten. Das ist eigentlich eine ganz nette Methode, da es, wie in den meisten Flavors, separate Anker für den Anfang und das Ende von Strings gibt: \A, \Z und \z.
Andererseits kann man die Entscheidung von Ruby bedauern, das m-Flag und den Modifikator auf eine nicht standardisierte Weise zu verwenden (siehe DOTALL).
Inline-Modifikator (?m)
In .NET, PCRE (C, PHP, R…), Perl, Python, Java und Ruby (aber nicht JavaScript) können Sie den Inline-Modifikator (?m) verwenden, zum Beispiel in (?m)^cat. Im Abschnitt über Inline-Modifikatoren finden Sie pikante Details über drei zusätzliche Funktionen (die in Python nicht verfügbar sind): Einschalten in der Mitte der Zeichenkette, Ausschalten mit (?-m) oder Anwendung nur auf den Inhalt einer Nicht-Capture-Gruppe mit (?m:foo)
.NET
Neben dem Inline-Modifikator (?m) haben .NET-Sprachen die Option Multiline. In C# können Sie zum Beispiel verwenden:

var catRegex = new Regex("^cat", RegexOptions.IgnoreCase | RegexOptions.Multiline); 

Perl
Neben dem Inline-Modifikator (?m) können Sie in Perl das Flag m nach dem abschließenden Begrenzer Ihres Musters hinzufügen. Zum Beispiel können Sie verwenden:
if ($the_subject =~ m/^cat/m) { … }
PCRE (C, PHP, R…)
Abgesehen vom (?m) Inline-Modifikator können Sie in PCRE den PCRE_MULTILINE-Modus beim Aufruf der Funktion pcre_compile() (oder einer ähnlichen Funktion) setzen:

cat_regex = pcre_compile( "^cat", PCRE_CASELESS | PCRE_MULTILINE, &error, &erroroffset, NULL ); 

In PHP wird die PCRE_MULTILINE-Option über das m-Flag übergeben, das Sie in Ihrem Regex-String nach dem schließenden Begrenzer hinzufügen können. Zum Beispiel können Sie verwenden:
$cat_regex = '~^cat~m';
Python
Neben dem (?m) Inline-Modifikator verfügt Python über die Option MULTILINE. Sie können zum Beispiel verwenden:

cat_regex = re.compile("^cat", re.IGNORECASE | re.MULTILINE)
Java
Abgesehen vom (?m) Inline-Modifikator hat Java die MULTILINE-Option. Sie können zum Beispiel verwenden:

Pattern catRegex = Pattern.compile( "^cat", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); 

JavaScript
In JavaScript besteht Ihre einzige Möglichkeit darin, das Flag m nach dem abschließenden Begrenzungszeichen des Musters hinzuzufügen. Zum Beispiel können Sie verwenden:
var catRegex = /^cat/m;
(direkter Link)

Free-Spacing: x (außer JavaScript)

Standardmäßig gibt jedes Leerzeichen in einer Regex-Zeichenkette ein Zeichen an, das abgeglichen werden soll. In Sprachen, in denen Sie Regex-Zeichenfolgen auf mehreren Zeilen schreiben können, geben die Zeilenumbrüche auch die zu übereinstimmenden Zeichen an. Da Sie keine Leerzeichen einfügen können, um Gruppen zu trennen, die unterschiedliche Bedeutungen haben (wie Sie es im Englischen zwischen Phrasen und Pragraphen tun), kann eine Regex schwer zu lesen sein, wie zum Beispiel die Regex „Meaning of Life“ von der Regex-Humor-Seite:
^(?=(?!(.))()(?-1)(?<!\d(?<=(?!)\d))).$
Glücklicherweise unterstützen viele Engines einen Modus für freie Abstände, mit dem Sie Ihre Regex auflockern können. Sie können zum Beispiel Leerzeichen zwischen den Token einfügen. In PHP könnten Sie Folgendes schreiben – beachten Sie das x-Flag nach dem letzten Begrenzer ~:
$word_with_digit_and_cap_regex = '~ ^ (?=\D*\d) \w*\w* $ ~x';
Aber warum in einer Zeile bleiben? Sie können Ihre Regex auf beliebig viele Zeilen verteilen, indem Sie sie einrücken und Kommentare hinzufügen, die durch ein # eingeleitet werden. In C# können Sie zum Beispiel so vorgehen:

var wordWithDigitAndCapRegex = new Regex(@"(?x) # Free-spacing mode ^ # Assert that position = beginning of string ######### Lookahead ########## (?= # Start lookahead \D* # Match any non-digits \d # Match one digit ) # End lookahead ######## Matching Section ######## \w* # Match any word chars # Match one upper-case letter \w* # Match any word chars $ # Assert that position = end of string");

Dieser Modus wird Free-Spacing-Modus genannt. Man nennt ihn auch Leerraummodus, Kommentarmodus oder Ausführlichkeitsmodus.
Bei einer einfachen Regex wie der obigen mag er übertrieben sein (obwohl jeder, der Ihren Code pflegen muss, Ihnen dafür danken wird). Aber wenn Sie ein ernsthaftes Regex-Muster wie das im Trick erstellen, um Zahlen in einfachem Englisch abzugleichen… Wenn Sie kein Masochist sind, haben Sie keine andere Wahl.
Bitte beachten Sie, dass innerhalb einer Zeichenklasse das Leerzeichen und das # (das sonst Kommentare einleitet) immer noch beachtet werden – außer in Java, wo beide Zeichen escaped werden müssen, wenn Sie diese Zeichen abgleichen wollen.

Für mehrere Engines gibt es zwei Möglichkeiten, den Modus für freie Abstände einzuschalten: als Inline-Modifikator oder als Option in der Regex-Methode oder -Funktion.
Der Modus für freie Abstände ist wunderbar, aber es gibt ein paar kleine Gefahren, die Sie beachten sollten, da sie dazu führen können, dass Sie sich den Kopf darüber zerbrechen, warum ein Muster nicht so funktioniert, wie Sie es erwarten.
Stolperfalle Nr. 1: Die Bedeutung von Leerzeichen
Erstens können Sie nicht mehr Number: \d+ verwenden, um eine Zeichenfolge wie Number: 24 zu finden. Der Grund dafür ist, dass das Leerzeichen in : \d nicht mehr mit einem Leerzeichen übereinstimmt. Wir sind im Modus für freie Abstände, schon vergessen? Das ist der Sinn der Sache.
Um ein Leerzeichen zu finden, müssen Sie es angeben. Die beiden wichtigsten Möglichkeiten dazu sind, es innerhalb einer Zeichenklasse zu platzieren oder es mit einem Backslash zu umgehen. Beide Möglichkeiten sind möglich: Number:\d+ oder Number:\ \d+
Natürlich würde auch Number:\s\d+ passen, aber denken Sie daran, dass \s auf viel mehr als ein Leerzeichen passt. Es könnte zum Beispiel auf einen Tabulator oder einen Zeilenumbruch passen. Das ist vielleicht nicht das, was Sie wollen.
Stolperfalle Nr. 2: Verspäteter Start
Zweitens könnten Sie zu viel Vertrauen in die Macht des freien Abstands haben und etwas wie das Folgende versuchen, um die Regex für sich alleine stehen zu lassen:

var wordWithDigitAndCapRegex = new Regex(@" (?x) # Free-spacing mode ^ # Beginning of string etc # Match the literal chars e,t,c");

Das Problem dabei ist, dass es zwar so aussieht, als ob der freie Abstandsmodifikator (?x) das erste Element der Regex ist, ist es das nicht.
Nach dem öffnenden Anführungszeichen “ gibt es einen Zeilenumbruch und eine Reihe von Leerzeichen. Der Motor versucht, diese abzugleichen, da wir uns zu diesem Zeitpunkt noch nicht im Modus für freie Abstände befinden. Dieser Modus wird erst aktiviert, wenn wir auf (?x) treffen. Diese Regex wird niemals mit der Zeichenkette usw. übereinstimmen, denn zu dem Zeitpunkt, an dem wir auf den Anfang des Zeichenkettenankers ^ stoßen, sollten wir bereits einen Zeilenumbruch und Leerzeichen gefunden haben!
Deshalb werden Sie, wenn Sie sich das erste Beispiel ansehen, sehen, dass der Modifikator für freie Abstände (?x) das allererste Zeichen nach dem öffnenden Anführungszeichen ist.
Whitespace wird nicht einfach aus dem Muster herausgeschnitten
Auch wenn Whitespace ignoriert wird, trennt die Position eines Whitespaces immer noch das vorherige Token vom nächsten. Zum Beispiel ist

✽ (A)\1 2 nicht dasselbe wie (A)\12. Ersteres entspricht AA2, letzteres entspricht A\n in .NET, PCRE, Perl und Ruby (12 ist der Oktalcode für das Zeilenvorschubzeichen)
✽ \p{Nd} ist gültig, aber \p{N d} ist es nicht – außer in Perl und Ruby
JavaScript
JavaScript unterstützt den Modus für freie Abstände nicht. Um in JavaScript ein beliebiges Zeichen einschließlich Zeilenumbruch zu finden, verwenden Sie ein Konstrukt wie . Diese Zeichenklasse passt auf ein Zeichen, das entweder eine Nicht-Ziffer \D oder eine Ziffer \d ist. Daher passt sie auf jedes Zeichen.
Eine andere JavaScript-Lösung ist die Verwendung der XRegExp-Regex-Bibliothek. Wenn Sie unendlich viel Zeit haben, können Sie auch versuchen, PCRE mit Emscripten nach JavaScript zu portieren, wie es Firas in regex 101 getan zu haben scheint.
Inline Modifier (?s)
In .NET, PCRE (C, PHP, R…), Perl, Python, Java und Ruby (aber nicht JavaScript) können Sie den Inline Modifier (?x) verwenden, z. B. ist dies eine erweiterte Regex, um wiederholte Wörter zu finden:
(?x) (\w+) + \bSiehe auch den Abschnitt über Inline-Modifikatoren.
.NET
Neben dem Inline-Modifikator (?x) haben .NET-Sprachen die Option IgnorePatternWhitespace. In C# können Sie beispielsweise Folgendes verwenden:

var repeatedWordRegex = new Regex(@" (\w+) + \b", RegexOptions.IgnorePatternWhitespace );

Perl
Neben dem Inline-Modifikator (?x) können Sie in Perl das x-Flag nach dem abschließenden Begrenzer Ihres Musters hinzufügen. Zum Beispiel können Sie verwenden:
if ($the_subject =~ m/(\w+) + \b/x) { … }
PCRE (C, PHP, R…)
Neben dem (?x) Inline-Modifikator können Sie in PCRE den Modus PCRE_EXTENDED beim Aufruf der Funktion pcre_compile() (oder einer ähnlichen Funktion) setzen:

repeated_word_regex = pcre_compile( "(\w+) + \b", PCRE_EXTENDED, &error, &erroroffset, NULL ); 

In PHP wird die Option PCRE_EXTENDED über das x-Flag übergeben, das Sie in Ihrem Regex-String nach dem schließenden Begrenzer hinzufügen können. Zum Beispiel können Sie verwenden:
$repeated_word_regex = '~(\w+) + \b~x';
Python
Neben dem (?x) Inline-Modifikator verfügt Python über die Option VERBOSE. Sie können z.B. verwenden:
repeated_word_regex = re.compile(r"(\w+) + \b", re.VERBOSE)
Java
Im Gegensatz zu anderen Engines werden innerhalb einer Java-Zeichenklasse Hashes, die Kommentare und Leerzeichen einführen, ignoriert, so dass Sie sie entschlüsseln müssen, wenn Sie diese Zeichen in einer Klasse verwenden wollen, z.B. +
Abgesehen von dem (?x) Inline-Modifikator hat Java die Option COMMENTS. Zum Beispiel können Sie verwenden:

Pattern repeatedWordRegex = Pattern.compile( "(\w+) + \1\b", Pattern.COMMENTS );

Ruby
Abgesehen vom (?x) Inline-Modifikator können Sie in Ruby das x-Flag am Ende Ihrer Regex-Zeichenkette hinzufügen. Zum Beispiel können Sie verwenden:
repeated_word_regex = /(\w+) + \b/x
(direkter Link)

Andere Modifikatoren

Einige Engines unterstützen Modifikatoren und Flags zusätzlich zu i, s, m und x. Ich habe vor, diese auf den Seiten zu behandeln, die diesen Flavors gewidmet sind.
Zum Beispiel hat
✽ .NET den (?n)-Modifikator (auch zugänglich über die Option ExplicitCapture). Damit werden alle (Klammern) zu Nicht-Erfassungsgruppen. Um zu erfassen, müssen Sie benannte Gruppen verwenden.
✽ Java hat den (?d)-Modifikator (auch über die UNIX_LINES-Option zugänglich). Wenn dieser aktiviert ist, ist das Zeilenvorschubzeichen \n das einzige, das auf den Punkt . (der nicht mit Zeilenumbrüchen übereinstimmt, es sei denn, DOTALL ist aktiviert) und die Anker ^ und $ (die mit Zeilenanfängen und -enden im Mehrzeilenmodus übereinstimmen)
✽ Perl hat mehrere andere Flags. Siehe den Abschnitt Modifikatoren in der Dokumentation.
✽ PCRE hat den (?J) Modifikator (auch im Code über die Option PCRE_DUPNAMES verfügbar). Wenn diese Option gesetzt ist, können verschiedene Capture-Gruppen denselben Namen verwenden, obwohl ihnen unterschiedliche Nummern zugewiesen werden.
(direkter Link)
✽ PCRE verfügt über den Modifikator (?U) (auch im Code über die Option PCRE_UNGREEDY verfügbar). Wenn diese Option gesetzt ist, sind Quantoren standardmäßig nicht gierig. Das Anhängen eines ? macht sie gierig.
(direkter Link)
✽ PCRE hat den (?X) Modifikator (auch im Code über die Option PCRE_EXTRA verfügbar). In der Vergangenheit wurde dieser Modus verwendet, um neue Funktionen in der Entwicklung zu aktivieren. Derzeit löst er Fehler aus, wenn Token wie \B in einer Zeichenklasse verwendet werden (wo es normalerweise mit dem Großbuchstaben B übereinstimmt, im Gegensatz zu außerhalb einer Zeichenklasse, wo es sich um eine Nicht-ein-Wort-Grenzwert-Behauptung handelt).
✽ PCRE hat eine Reihe spezieller Modifikatoren, die am Anfang des Musters gesetzt werden können (diese sind unten dargestellt). Darüber hinaus können viele Optionen an die pcre_compile()-Funktionsfamilie gesendet werden, wenn Sie Zugriff auf diese haben. Details dazu finden Sie in pcre_compile.html aus dem doc-Ordner, wenn Sie PCRE herunterladen.
(direkter Link)

PCRE’s Special Start-of-Pattern Modifiers

PCRE hat eine Reihe von „speziellen Modifikatoren“, die Sie am Anfang eines Musters setzen können. Anstelle der Standard-Syntax (?z) für Inline-Modifikatoren sieht die Syntax der speziellen Modifikatoren wie (*MYMODIFIER) aus. Diese Modifikatoren sind besonders nützlich in Kontexten, in denen PCRE in ein Werkzeug oder eine Sprache integriert ist – da sie eine Reihe von Optionen ersetzen, die Sie an pcre_compile() senden würden.

UTF-Strings
Angenommen, PCRE wird mit den entsprechenden Optionen kompiliert, kann man die Engine anweisen, den Subjekt-String als verschiedene Arten von UTF-Strings zu behandeln.
✽ (*UTF) ist ein generischer Weg, den Subjekt-String als UTF-String zu behandeln – er erkennt, ob er als UTF-8, UTF-16 oder UTF-32 behandelt werden soll.
✽ (*UTF8), (*UTF16) und (*UTF32) behandeln die Zeichenkette als eine von drei spezifischen UTF-Kodierungen.
Unicode-Eigenschaften für \d und \w
Standardmäßig passt \d nur auf ASCII-Ziffern, während \w nur auf ASCII-Ziffern, Buchstaben und Unterstriche passt.
Der (*UCP) Modifikator (steht für Unicode Character Properties) erlaubt es diesen Token, mit Unicode-Ziffern und Wortzeichen übereinzustimmen.
Zum Beispiel, (*UCP)\d+ :: \w+ entspricht 1۳۲١८৮੪ :: Aれま래도ᚠᚱᚩ
(Siehe Demo).
In Kombination mit (*UCP) müssen Sie eventuell auch einen der (*UTF) Modifikatoren verwenden. Um zu sehen, wie das funktioniert, betrachten Sie die Ausgabe dieses Programms mit einem Standard-Xampp-PHP:

$string = '1۳۲١८৮੪ :: Aれま래도ᚠᚱᚩ';$utfregex = "~\d+ :: \w+~";$utfregex = "~(*UCP)\d+ :: \w+~";$utfregex = "~(*UTF)(*UCP)\d+ :: \w+~";$utfregex = "~(*UTF)\d+ :: \w+~";$utfregex = "~\d+ :: \w+~u";foreach (range(0, 4) as $i) { echo "$i: ".preg_match($utfregex,$string)."<br />"; }// Output:// 0: 0// 1: 0// 2: 1 => (*UTF)(*UCP)// 3: 0// 4: 1 => The u flag produces the same result as (*UTF)(*UCP)

Zeilenumbruch-Modifikatoren
Wenn PCRE kompiliert wird, teilen Sie ihm standardmäßig mit, was es als Zeilenumbruch betrachten soll, wenn es auf ein . stößt (da der Punkt nicht mit Zeilenumbrüchen übereinstimmt, es sei denn, er befindet sich im dotall-Modus), ebenso wie das Verhalten der ^- und $-Anker im Mehrzeilenmodus. Sie können diese Vorgabe mit den folgenden Modifikatoren außer Kraft setzen:
✽ (*CR) Nur ein Wagenrücklauf wird als Zeilenumbruch betrachtet
✽ (*LF) Nur ein Zeilenvorschub wird als Zeilenumbruch betrachtet (wie unter Unix)
✽ (*CRLF) Nur ein Wagenrücklauf gefolgt von einem Zeilenvorschub wird als als Zeilenumbruch (wie unter Windows)
✽ (*ANYCRLF) Jede der drei oben genannten Sequenzen gilt als Zeilenumbruch
✽ (*ANY) Jede Unicode-Neuzeilenfolge gilt als Zeilenumbruch
Zum Beispiel, (*CR)\w+.\w+ passt zu Line1\nLine2, da der Punkt mit dem \n übereinstimmen kann, das nicht als Zeilenumbruch betrachtet wird. Siehe Demo.
Steuerung von \R
Standardmäßig passt das Metacharakter \R auf jede Unicode-Zeilenumbruchsequenz. Wenn der UTF-8-Modus ausgeschaltet ist, sind diese Zeilenumbrüche das Paar \r\n sowie die Zeichen Carriage Return, Line Feed, Vertical Tab, Form Feed oder Next Line. Im UTF-8-Modus passt das Token auch auf das Zeilentrennzeichen und das Absatztrennzeichen.
Mit zwei Start-of-Pattern-Modifikatoren können Sie das Verhalten von \R ändern:
✽ Mit (*BSR_ANYCRLF) passt \R nur auf die \r\n-Sequenz, \r oder \n. Dies kann auch gesetzt werden, wenn PCRE kompiliert oder über die Option PCRE_BSR_ANYCRLF angefordert wird
✽ Mit (*BSR_UNICODE) passt \R auf jede Unicode-Neuzeilensequenz (und überschreibt die Option PCRE_BSR_ANYCRLF, falls gesetzt). Dies kann auch gesetzt werden, wenn PCRE kompiliert oder über die Option PCRE_BSR_UNICODE angefordert wird
Kontrolle von Durchlaufmustern
Um die Anzahl der Aufrufe der Funktion match() durch PCRE zu begrenzen, verwenden Sie den Modifikator (*LIMIT_MATCH=x) und setzen Sie x auf die gewünschte Anzahl.
Um die Rekursion zu begrenzen, verwenden Sie (*LIMIT_RECURSION=d), indem Sie d auf die tiefste erlaubte Rekursionsebene setzen.
Ausschalten von Optimierungen
(direkter Link)
Standardmäßig untersucht PCRE das Muster und macht ein quantifiziertes Token automatisch atomar, wenn das folgende Token inkompatibel ist – zum Beispiel wird A+X zu A++X. Der Modifikator (*NO_AUTO_POSSESS) schaltet diese Optimierung aus. Verwenden Sie dies, wenn Sie pcretest verwenden wollen, um zwei Muster zu vergleichen und sich über all die Zyklen zu freuen, die Ihnen die automatische Possessifikation erspart.
Standardmäßig führt PCRE mehrere Optimierungen durch, um schneller herauszufinden, ob eine Übereinstimmung fehlschlagen wird. Der Modifikator (*NO_START_OPT) schaltet diese Optimierungen aus.
Deaktivieren von leeren Übereinstimmungen
In PCRE2 weist (*NOTEMPTY) die Engine an, keine leeren Übereinstimmungen zurückzugeben. Ebenso weist (*NOTEMPTY_ATSTART) die Engine an, keine leeren Übereinstimmungen zurückzugeben, die am Anfang des Themas gefunden wurden.
Deaktivieren der automatischen Verankerungsoptimierung
In PCRE2 weist PCRE2_NO_DOTSTAR_ANCHOR die Engine an, Muster nicht automatisch zu verankern, die mit beginnen.*
Sie können mehr über dieses Flag auf der PCRE2 API Seite lesen (suchen Sie nach PCRE2_NO_DOTSTAR_ANCHOR).

Verpassen Sie nicht den Regex Style Guide
und den besten Regex Trick aller Zeiten!!!


Die 1001 Möglichkeiten, Regex zu benutzen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.