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)



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow