Regular Expressions
Regex-Modifikatoren (Flags)
Suche…
Einführung
Muster für reguläre Ausdrücke werden häufig mit Modifizierern (auch Flags genannt ) verwendet, die das Regex-Verhalten neu definieren. Regex-Modifikatoren können regulär (z. B. /abc/i
) und inline (oder eingebettet ) (z. B. (?i)abc
) sein. Die gebräuchlichsten Modifizierer sind globale, Groß- und Kleinschreibung, Multiline- und Dotall-Modifizierer. Regex-Flavors unterscheiden sich jedoch in der Anzahl der unterstützten Regex-Modifikatoren und ihren Typen.
Bemerkungen
PCRE-Modifikatoren
Modifikator | In der Reihe | Beschreibung |
---|---|---|
PCRE_CASELESS | (?ich) | Groß- und Kleinschreibung |
PCRE_MULTILINE | (? m) | Mehrzeilige Übereinstimmung |
PCRE_DOTALL | (? s) | . passt zu neuen Zeilen |
PCRE_ANCHORED | (?EIN) | Das Meta-Zeichen ^ stimmt nur beim Start überein |
PCRE_EXTENDED | (? x) | Leerzeichen werden ignoriert |
PCRE_DOLLAR_ENDONLY | n / a | Metazeichen $ stimmt nur am Ende überein |
PCRE_EXTRA | (? X) | Strikte Fluchtanalyse |
PCRE_UTF8 | Verarbeitet UTF-8 Zeichen | |
PCRE_UTF16 | Verarbeitet UTF-16 Zeichen | |
PCRE_UTF32 | Verarbeitet UTF-32 Zeichen | |
PCRE_UNGREEDY | (? U) | Setzt die Engine auf Lazy Matching |
PCRE_NO_AUTO_CAPTURE | (? :) | Deaktiviert die automatische Erfassung von Gruppen |
Java-Modifikatoren
Modifikator ( Pattern.### ) | Wert | Beschreibung |
---|---|---|
UNIX_LINES | 1 | Aktiviert den Unix- Zeilenmodus. |
CASE_INSENSITIVE | 2 | Aktiviert die Groß- und Kleinschreibung ohne Übereinstimmung. |
BEMERKUNGEN | 4 | Erlaubt Leerzeichen und Kommentare in einem Muster. |
MULTILINE | 8 | Aktiviert den mehrzeiligen Modus. |
LITERAL | 16 | Ermöglicht das literale Parsen des Musters. |
DOTALL | 32 | Aktiviert den Dotall-Modus. |
UNICODE_CASE | 64 | Aktiviert die Unicode-Erkennung von Groß- und Kleinschreibung. |
CANON_EQ | 128 | Ermöglicht kanonische Äquivalenz. |
UNICODE_CHARACTER_CLASS | 256 | Aktiviert die Unicode-Version von Vordefinierten Zeichenklassen und POSIX-Zeichenklassen. |
DOTALL-Modifikator
Ein Regex-Muster, bei dem ein DOTALL-Modifikator (in den meisten Regex-Varianten mit s
ausgedrückt) das Verhalten von ändert .
So kann es mit einem Newline-Symbol (LF) übereinstimmen:
/cat (.*?) dog/s
Dieser Regex im Perl-Stil passt zu einer Zeichenfolge wie "cat fled from\na dog"
, die "fled from\na"
gefangen "fled from\na"
in Gruppe 1 "fled from\na"
.
Eine Inline-Version: (?s)
(zB (?s)cat (.*?) dog
)
Hinweis : In Ruby ist der Modifikator DOTALL der Modifikator m
, Regexp::MULTILINE
(z. B. /a.*b/m
).
Hinweis : JavaScript bietet keinen Modifikator DOTALL, also a .
darf niemals mit einem Zeilenvorschubzeichen übereinstimmen. Um den gleichen Effekt zu erzielen, ist ein Workaround erforderlich, z .
s mit einer Catch-All-Zeichenklasse wie [\S\s]
oder einer Nicht-Nichts- Zeichenklasse [^]
(dieses Konstrukt wird jedoch von allen anderen Engines als Fehler behandelt und ist daher nicht portierbar).
MULTILINE-Modifikator
Ein anderes Beispiel ist ein MULTILINE-Modifikator (normalerweise mit m
Flag ausgedrückt (nicht in Oniguruma (z. B. Ruby), der m
, um einen DOTALL-Modifikator zu bezeichnen)), der die ^
und $
-Anker mit dem Anfang / Ende einer Zeile und nicht mit dem Anfang / Ende übereinstimmt der ganzen Saite.
/^My Line \d+$/gm
findet alle Zeilen , die mit My Line
, und enthalten dann ein Leerzeichen und 1+ Ziffern bis zum Zeilenende.
Eine Inline-Version: (?m)
(zB (?m)^My Line \d+$
)
HINWEIS : In Oniguruma (z. B. in Ruby) und auch in fast allen Texteditoren, die Regexps unterstützen, geben die Ankreuzzeichen ^
und $
standardmäßig die Anfangs- und Endpositionen von Zeilen an. Sie müssen \A
, um den gesamten Anfang des Dokuments / der Zeichenfolge zu definieren, und \z
, um das Ende des Dokuments / der Zeichenkette anzugeben. Der Unterschied zwischen \Z
und \z
besteht darin, dass der Erstgenannte vor dem letzten Zeilenvorschub (LF) am Ende der Zeichenfolge /\Astring\Z/
(z. B. /\Astring\Z/
findet eine Übereinstimmung in "string\n"
) (außer Python, wobei \Z
Verhalten gleich \z
und \z
Anker nicht unterstützt wird).
IGNORE CASE-Modifizierer
Der häufigste Modifikator, der den Fall ignoriert, ist i
:
/fog/i
foG
Fog
, foG
usw.
Die Inline-Version des Modifikators sieht wie (?i)
.
Anmerkungen:
In Java wird bei der Übereinstimmung zwischen Groß- und Kleinschreibung standardmäßig davon ausgegangen, dass nur Zeichen im US-ASCII-Zeichensatz abgeglichen werden. Unicode- UNICODE_CASE
Übereinstimmungen ohne UNICODE_CASE
Groß- und Kleinschreibung können aktiviert werden, indem das Flag UNICODE_CASE
in Verbindung mit diesem Flag ( CASE_INSENSITIVE
) angegeben wird . (zB Pattern p = Pattern.compile("YOUR_REGEX", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
). Weitere Informationen hierzu finden Sie unter Case-Insensitive Matching in Java RegEx . Außerdem kann UNICODE_CHARACTER_CLASS
verwendet werden, um übereinstimmende Unicode- UNICODE_CHARACTER_CLASS
.
VERBOSE / COMMENT / IgnorePatternWhitespace-Modifizierer
Der Modifikator, mit dem Leerzeichen in einigen Teilen des Musters verwendet werden können, um es für eine bessere Lesbarkeit zu formatieren und Kommentare zuzulassen, die mit #
:
/(?x)^ # start of string
(?=\D*\d) # the string should contain at least 1 digit
(?!\d+$) # the string cannot consist of digits only
\# # the string starts with a hash symbol
[a-zA-Z0-9]+ # the string should have 1 or more alphanumeric symbols
$ # end of string
/
Beispiel für einen String: #word1here
. Beachten Sie, dass das #
-Symbol mit einem Escapezeichen versehen ist, um ein Literal #
zu kennzeichnen, das Teil eines Musters ist.
Nicht maskierte Leerräume im Muster für reguläre Ausdrücke werden ignoriert. Umgehen Sie es, um es zu einem Teil des Musters zu machen.
Normalerweise wird der Whitespace innerhalb von Zeichenklassen ( [...]
) mit Ausnahme von Java als Literal Whitespace behandelt.
Erwähnenswert ist auch, dass in PCRE, .NET, Python, Ruby Oniguruma, Intensivstation, Boost-Regex-Flavours (?#:...)
Kommentare im Regex-Muster verwendet werden können.
Expliziter Erfassungsmodifikator
Dies ist ein .NET-regulärer Modifikator, der mit n
ausgedrückt wird. Bei Verwendung werden nicht benannte Gruppen (wie (\d+)
) nicht erfasst. Nur gültige Captures werden explizit als Gruppen bezeichnet (z. B. (?<name> subexpression)
).
(?n)(\d+)-(\w+)-(?<id>\w+)
123-1_abc-00098
mit dem gesamten 123-1_abc-00098
, aber (\d+)
und (\w+)
erstellen keine Gruppen im resultierenden Übereinstimmungsobjekt. Die einzige Gruppe ist ${id}
. Siehe Demo .
UNICODE-Modifizierer
Der UNICODE-Modifizierer, normalerweise ausgedrückt als u
(PHP, Python) oder U
(Java), veranlasst die Regex-Engine, das Muster und die Eingabezeichenfolge als Unicode-Strings und -Muster zu behandeln. Dabei werden die Musterkurzklassen wie \w
, \d
, \s
usw. Unicode-fähig.
/\A\p{L}+\z/u
ist eine PHP-Regex, um Zeichenfolgen abzugleichen, die aus einem oder mehreren Unicode-Buchstaben bestehen. Siehe die Regex-Demo .
Beachten Sie, dass der Modifikator /u
in PHP der PCRE-Engine ermöglicht, Zeichenfolgen als UTF8-Zeichenfolgen zu behandeln (durch PCRE_UTF8
Verbs PCRE_UTF8
) und die Abkürzungszeichenklassen im Unicode-Muster zu aktivieren (durch Aktivieren des PCRE_UCP
Verbs siehe mehr auf pcre.org ). .
Muster- und Betreff-Zeichenfolgen werden als UTF-8 behandelt. Dieser Modifikator ist ab PHP 4.1.0 oder höher unter Unix und ab PHP 4.2.3 unter Win32 verfügbar. Die UTF-8-Gültigkeit des Musters und des Subjekts wird seit PHP 4.3.5 geprüft. Bei einem ungültigen Betreff stimmt die Funktion preg_ * mit nichts überein. Ein ungültiges Muster löst einen Fehler der Stufe E_WARNING aus. UTF-8-Sequenzen mit fünf und sechs Oktetten gelten seit PHP 5.3.4 als ungültig (bzw. PCRE 7.3 2007-08-28). früher wurden diese als gültiges UTF-8 betrachtet.
In Python 2.x wirkt sich re.UNICODE
nur auf das Muster selbst aus: Machen Sie \w
, \W
, \b
, \B
, \d
, \D
, \s
und \S
von der Unicode-Eigenschaftendatenbank abhängig.
Eine Inline-Version: (?u)
in Python, (?U)
in Java. Zum Beispiel:
print(re.findall(ur"(?u)\w+", u"Dąb")) # [u'D\u0105b']
print(re.findall(r"\w+", u"Dąb")) # [u'D', u'b']
System.out.println("Dąb".matches("(?U)\\w+")); // true
System.out.println("Dąb".matches("\\w+")); // false
PCRE_DOLLAR_ENDONLY-Modifizierer
Der PCRE-kompatible PCRE_DOLLAR_ENDONLY- Modifizierer, mit dem der $
anchor am Ende der Zeichenfolge übereinstimmt (mit Ausnahme der Position vor der letzten Zeile in der Zeichenfolge).
/^\d+$/D
entspricht
/^\d+\z/
und entspricht einer ganzen Zeichenfolge, die aus einer oder mehreren Ziffern besteht und nicht mit "123\n"
übereinstimmt, sondern mit "123"
.
PCRE_ANCHORED-Modifizierer
Ein weiterer PCRE-kompatibler Modifikator, der mit /A
-Modifikator ausgedrückt wird. Wenn dieser Modifikator gesetzt ist, muss das Muster "verankert" werden, d. H., Es ist nur an den Anfang der gesuchten Zeichenfolge ("Betreff-Zeichenfolge") angepasst. Dieser Effekt kann auch durch entsprechende Konstrukte im Pattern selbst erreicht werden. Dies ist die einzige Möglichkeit, dies in Perl zu tun.
/man/A
ist das gleiche wie
/^man/
PCRE_UNGREEDY-Modifizierer
Das PCRE-kompatible PCRE_UNGREEDY-Flag, das mit /U
ausgedrückt wird. Es wechselt die Gier innerhalb eines Musters: /a.*?b/U
= /a.*b/
und umgekehrt.
PCRE_INFO_JCHANGED-Modifizierer
Ein weiterer PCRE-Modifikator, der die Verwendung doppelter benannter Gruppen ermöglicht.
HINWEIS : Nur Inline- Version wird unterstützt - (?J)
und muss am Anfang des Patterns platziert werden.
Wenn du benutzt
/(?J)\w+-(?:new-(?<val>\w+)|\d+-empty-(?<val>[^-]+)-collection)/
Die "val" -Gruppenwerte sind nie leer (werden immer gesetzt). Ein ähnlicher Effekt kann jedoch mit dem Zurücksetzen der Verzweigung erreicht werden.
PCRE_EXTRA-Modifizierer
Ein PCRE-Modifikator, der einen Fehler verursacht, wenn einem Backslash in einem Muster ein Buchstabe folgt, der keine besondere Bedeutung hat. Standardmäßig wird ein umgekehrter Schrägstrich gefolgt von einem Buchstaben ohne besondere Bedeutung als Literal behandelt.
Z.B
/big\y/
wird mit bigy
, aber
/big\y/X
wird eine Ausnahme auslösen.
Inline-Version: (?X)