Share via


Reguläre Ausdrücke (C++)

In diesem Thema werden die Grammatiken der verschiedenen Module für reguläre Ausdrücke behandelt.

In diesem Thema

  • Grammatik für reguläre Ausdrücke

  • Zusammenfassung der Grammatik

  • Semantische Details

  • Zuordnen und Suchen

  • Formatflags

Grammatik für reguläre Ausdrücke

Element

Bei einem Element kann es sich um Folgendes handeln:

  • Ein normales Zeichen, das dem gleichen Zeichen in der Zielsequenz entspricht.

  • Ein Platzhalterzeichen "." das jedem Zeichen in der Zielsequenz außer einem Zeilenumbruch entspricht.

  • Ein Klammerausdruck im Format "[expr]", das einem Zeichen oder einem Sortierreihenfolgenelement in der Zielsequenz entspricht, die ebenfalls in dem durch den Ausdruck expr definierten Satz enthalten ist, oder im Format "[^expr]", das einem Zeichen oder einem Sortierreihenfolgenelement in der Zielsequenz entspricht, die nicht in dem durch den Ausdruck expr definierten Satz enthalten ist.

    Der Ausdruck expr kann jede Kombination der folgenden Elemente enthalten:

    • Ein einzelnes Zeichen. Fügt das Zeichen dem Satz hinzu, der durch expr definiert wird.

    • Ein Zeichenbereich im Format "ch1-ch2". Fügt die Zeichen, die durch Werte im geschlossenen Bereich [ch1, ch2] dargestellt werden, dem Satz hinzu, der durch expr festgelegt ist.

    • Eine Zeichenklasse im Format "[:name:"]. Fügt die Zeichen in der benannten Klasse dem Satz hinzu, der durch expr definiert wird.

    • Eine Äquivalenzklasse im Format "[=elt=]". Fügt Sortierungselemente, die mit elt äquivalent sind, dem Satz hinzu, der durch expr definiert wird.

    • Ein Sortierungssymbol im Format [".elt.]". Fügt das Sortierreihenfolgenelement elt dem Satz hinzu, der durch expr definiert wird.

  • Ein Anker. Der Anker "^" entspricht dem Anfang der Zielsequenz, während der Anker "$ " mit dem Ende der Zielsequenz übereinstimmt.

Eine Erfassungsgruppe im Format "( Teilausdruck )" oder "\( Teilausdruck \) in BRE und grep, die der Reihenfolge der Zeichen in der Zielsequenz entspricht, die anhand des Musters zwischen den Trennzeichen verglichen wird.

  • Ein Identitätsescapezeichen im Format "\k", das dem Zeichen k in der Zielsequenz entspricht.

Beispiele:

  • "a" entspricht der Zielsequenz "a", stimmt jedoch nicht mit den Zielsequenzen "B", "b" oder "c" überein.

  • "." entspricht allen Zielsequenzen "a", "B", "b" und "c".

  • "[b-z]" entspricht den Zielsequenzen "b" und "c", stimmt jedoch nicht mit den Zielsequenzen "a" oder "B" überein.

  • "[:lower:]" entspricht den Zielsequenzen "a", "b" und "c", stimmt jedoch nicht mit der Zielsequenz "B" überein.

  • "(a)" entspricht der Zielsequenz "a" und ordnet die Erfassungsgruppe 1 der Untersequenz "a" zu, stimmt jedoch nicht mit den Zielsequenzen "B", "b" oder "c" überein.

In ECMAScript, BRE und grep kann ein Element auch ein Rückverweis im Format "\dd" sein, wobei dd einen Dezimalwert N darstellt, der einer Folge von Zeichen in der Zielsequenz entspricht, die mit der Sequenz von Zeichen identisch ist, welche mit der N-ten Erfassungsgruppe übereinstimmt. "(a)\1" entspricht beispielsweise der Zielsequenz "aa", da die erste (und einzige) Erfassungsgruppe mit der ursprünglichen Sequenz "a" übereinstimmt und \1 dann der letzten Sequenz "a" entspricht.

In ECMAScript kann ein Element auch Folgendes sein:

  • Eine Nichterfassungsgruppe im Format "(?: Teilausdruck )". Entspricht der Folge von Zeichen in der Zielsequenz, die anhand des Musters zwischen den Trennzeichen verglichen wird.

  • Ein eingeschränktes Dateiformat-Escapezeichen im Format "\f", "\n", "\r", "\t" oder "\v". Diese Zeichen entsprechen einem Seitenvorschub, einem Zeilenumbruch, einem Wagenrücklauf, einem horizontalen bzw. einem vertikalen Tabulator in der Zielsequenz.

  • Eine positive Assertion im Format "(?= Teilausdruck )". Entspricht der Folge von Zeichen in der Zielsequenz, die anhand des Musters zwischen den Trennzeichen abgeglichen wird, jedoch die Abgleichungsposition in der Zielsequenz nicht ändert.

  • Eine negative Assertion im Format "(?! Teilausdruck )". Entspricht einer Folge von Zeichen in der Zielsequenz, die dem Muster zwischen den Trennzeichen nicht entspricht und mit der Abgleichungsposition in der Zielsequenz nicht übereinstimmt.

  • Eine hexadezimale Escapesequenz im Format "\xhh". Entspricht einem Zeichen in der Zielsequenz, das durch die zwei Hexadezimalzeichen hh dargestellt wird.

  • Eine Unicode-Escapesequenz im Format "\uhhhh". Entspricht einem Zeichen in der Zielsequenz, das durch die vier Hexadezimalzeichen hhhh dargestellt wird.

  • Eine Escapesequenz für Steuerzeichen im Format "\ck". Entspricht dem Steuerzeichen, das durch das Zeichen k benannt wird.

  • Eine Wortgrenzenassertion im Format "\b". Stimmt überein, wenn die aktuelle Position in der Zielsequenz unmittelbar hinter einer Wortgrenze liegt.

  • Eine negative Wortgrenzenassertion im Format "\B". Stimmt überein, wenn die aktuelle Position in der Zielsequenz nicht unmittelbar hinter einer Wortgrenze liegt.

  • Ein DSW-Escapezeichen im Format "\d", "\D", "\s", "\S", "\w", "\W". Gibt einen Kurznamen für eine Zeichenklasse an.

Beispiele:

  • "(?:a)" entspricht der Zielsequenz "a", aber "(?:a)\1" ist ungültig, da es keine Erfassungsgruppe 1 gibt.

  • "(?=a)a" entspricht der Zielsequenz "a". Die positive Assertion entspricht der ursprünglichen Sequenz "a" in der Zielsequenz, und der letzte Wert "a" im regulären Ausdruck entspricht der ursprünglichen Sequenz "a" in der Zielsequenz.

  • "(?!a)a" entspricht nicht der Zielsequenz "a".

  • "a\b" entspricht der Zielsequenz "a~", stimmt jedoch nicht mit der Zielsequenz "ab" überein.

  • "a\B." entspricht der Zielsequenz "ab", stimmt jedoch nicht mit der Zielsequenz "a~" überein.

In awk kann ein Element auch Folgendes sein:

  • Ein Dateiformat-Escapezeichen im Format "\\", "\a", "\b", "\f", "\n", "\r", "\t" oder "\v". Diese Zeichen entsprechen einem umgekehrten Schrägstrich, einer Warnmeldung, einer Rücktaste, einem Seitenvorschub, einem Zeilenumbruch, einem Wagenrücklauf, einem horizontalen bzw. einem vertikalen Tabulator in der Zielsequenz.

  • Eine oktale Escapesequenz im Format "\ooo". Entspricht einem Zeichen in der Zielsequenz, dessen Darstellung der Wert ist, der durch die ein, zwei oder drei oktalen Ziffern ooo dargestellt wird.

Wiederholen

Auf jedes Element außer einer positiven Assertion, einer negativen Assertion oder einem Anker kann eine Wiederholungsanzahl folgen. Die häufigste Art der Wiederholungsanzahl hat das Format "{min,max}" oder "\ {min,max\}" in BRE und grep. Ein Element, auf das dieses Format der Wiederholungsanzahl folgt, entspricht mindestens min aufeinander folgenden Vorkommen und nicht mehr als max aufeinander folgenden Vorkommen einer Sequenz, die mit dem Element übereinstimmt. Beispiel: "a{2,3}" entspricht der Zielsequenz "aa" und der Zielsequenz "aaa", aber nicht der Zielsequenz "a" oder der Zielsequenz "aaaa".

Für eine Wiederholungsanzahl können auch folgende Formate verwendet werden:

  • "{min}" oder "\{min\}" in BRE und grep. Entspricht "{min,min}".

  • "{min,}" oder "\{min,\}" in BRE und grep. Entspricht "{min,unbounded}".

  • "*". Entspricht "{0,unbounded}".

Beispiele:

  • "a{2}" entspricht der Zielsequenz "aa", jedoch nicht der Zielsequenz "a" oder der Zielsequenz "aaa".

  • "a{2,}" entspricht der Zielsequenz "aa", der Zielsequenz "aaa" usw., jedoch nicht der Zielsequenz "a".

  • "a*" entspricht der Zielsequenz "", der Zielsequenz "a", der Zielsequenz "aa" usw.

Für alle Grammatiken außer BRE und grep können für eine Wiederholungsanzahl folgende Formate verwendet werden:

  • "?". Entspricht "{0,1}".

  • "+". Entspricht "{1,unbounded}".

Beispiele:

  • "a?" entspricht der Zielsequenz "" und der Zielsequenz "a", jedoch nicht der Zielsequenz "aa".

  • "a+" entspricht der Zielsequenz "a", der Zielsequenz "aa" usw., jedoch nicht der Zielsequenz "".

In ECMAScript können alle Formate für die Wiederholungsanzahl vom Zeichen "?" gefolgt werden, das nicht gierige Wiederholung angibt.

Verkettung

Elemente des regulären Ausdrucks, mit oder ohne Wiederholungsanzahl, können verkettet werden, um längere reguläre Ausdrücke zu bilden. Der resultierende Ausdruck entspricht einer Zielsequenz, die eine Verkettung der Sequenzen ist, der die einzelnen Elemente entsprechen. Beispiel: "a{2,3}b" entspricht der Zielsequenz "aab" und der Zielsequenz "aaab", jedoch nicht der Zielsequenz "ab" oder der Zielsequenz "aaaab".

Alternierung

In allen Grammatiken für reguläre Ausdrücke außer BRE und grep kann ein verketteter regulärer Ausdruck vom Zeichen "|" und von einem anderen verketteten regulären Ausdruck gefolgt werden . Verkettete reguläre Ausdrücke können auf diese Weise in beliebiger Zahl kombiniert werden. Der resultierende Ausdruck entspricht jeder Zielsequenz, die mit mindestens einem verketteten regulären Ausdruck übereinstimmt.

Wenn mehrere der verketteten regulären Ausdrücke der Zielsequenz entsprechen, wählt ECMAScript den ersten verketteten regulären Ausdruck, der der Sequenz entspricht, als Übereinstimmung (erste Übereinstimmung) aus; die anderen Grammatiken für reguläre Ausdrücke wählen den Ausdruck aus, der die längste Übereinstimmung erzielt. Beispiel: "ab|cd" entspricht der Zielsequenz "ab" und der Zielsequenz "cd", jedoch nicht der Zielsequenz "abd" oder der Zielsequenz "acd".

In grep und egrep kann ein Zeilenumbruchzeichen ("\n") verwendet werden, um Alternierungen zu trennen.

Teilausdruck

In BRE und grep ist ein Teilausdruck eine Verkettung. In den anderen Grammatiken für reguläre Ausdrücke ist ein Teilausdruck eine Alternierung.

Zusammenfassung der Grammatik

In der folgenden Tabelle sind die Funktionen zusammengefasst, die in verschiedenen Grammatiken für reguläre Ausdrücke verfügbar sind:

Element

BRE

ERE

ECMA

grep

egrep

awk

Alternierung mit "|"

+

+

+

+

Alternierung mit "\n"

+

+

Anker

+

+

+

+

+

+

Rückverweis

+

+

+

Klammerausdruck

+

+

+

+

+

+

Erfassungsgruppe, die "()" verwendet

+

+

+

+

Erfassungsgruppe, die "\(\)" verwendet

+

+

Escapesequenz für Steuerzeichen

+

DSW-Escapezeichen

+

Dateiformat-Escapezeichen

+

+

Hexadezimale Escapesequenz

+

Identitätsescapezeichen

+

+

+

+

+

+

Negative Assertion

+

Negative Wortgrenzenassertion

+

Nichterfassungsgruppe

+

Nicht gierige Wiederholung

+

Oktale Escapesequenz

+

Normales Zeichen

+

+

+

+

+

+

Positive Assertion

+

Wiederholung mit "{}"

+

+

+

+

Wiederholung mit "\{\}"

+

+

Wiederholung mit "*"

+

+

+

+

+

+

Wiederholung mit "?" und "+"

+

+

+

+

Unicode-Escapesequenz

+

Platzhalterzeichen

+

+

+

+

+

+

Wortgrenzenassertion

+

Semantische Details

Anker

Ein Anker entspricht einer Position in der Zielzeichenfolge, keinem Zeichen. Ein "^" entspricht dem Anfang der Zielzeichenfolge, und ein "$" entspricht dem Ende der Zielzeichenfolge.

Rückverweis

Ein Rückverweis ist ein umgekehrter Schrägstrich, dem ein Dezimalwert N folgt. Er entspricht dem Inhalt der N-ten Erfassungsgruppe. Der Wert von N darf nicht mehr als die Anzahl von Erfassungsgruppen sein, die dem Rückverweis vorausgehen. In BRE und grep wird der Wert N durch die Dezimalstelle bestimmt, die dem umgekehrten Schrägstrich folgt. In ECMAScript wird der Wert N von allen Dezimalstellen bestimmt, die dem umgekehrten Schrägstrich unmittelbar folgen. Daher überschreitet der Wert N in BRE und grep nie den Wert 9, auch wenn der reguläre Ausdruck über mehr als neun Erfassungsgruppen verfügt. In ECMAScript ist der Wert N unbegrenzt.

Beispiele:

  • "((a+)(b+))(c+)\3" entspricht der Zielsequenz "aabbbcbbb". Der Rückverweis "\3" entspricht dem Text in der dritten Erfassungsgruppe, d. h "(b+)". Er entspricht nicht der Zielsequenz "aabbbcbb".

  • "(a)\2" ist nicht gültig.

  • "(b(((((((((a))))))))))\10" hat verschiedene Bedeutungen in BRE und ECMAScript. In BRE ist der Rückverweis "\1". Der Rückverweis entspricht dem Inhalt der ersten Erfassungsgruppe (d. h. der Gruppe, die mit "(b" beginnt und mit dem letzten Zeichen ")" endet und vor dem Rückverweis steht). Die letzte "0" entspricht dem normalen Zeichen "0". In ECMAScript ist der Rückverweis "\10". Er entspricht der zehnten Erfassungsgruppe, d. h. der innersten.

Klammerausdruck

Ein Klammerausdruck definiert einen Satz von Zeichen und Sortierungselementen. Wenn der Klammerausdruck mit dem Zeichen "^" beginnt, ist die Übereinstimmung erfolgreich, wenn keine Elemente im Satz dem aktuellen Zeichen in der Zielsequenz entsprechen. Andernfalls ist die Übereinstimmung erfolgreich, wenn eines der Elemente im Satz dem aktuellen Zeichen in der Zielsequenz entspricht.

Der Satz von Zeichen kann definiert werden, indem eine beliebige Kombination von einzelnen Zeichen, Zeichenbereichen, Zeichenklassen, Äquivalenzklassen und Sortierungssymbolen aufgelistet wird.

Erfassungsgruppe

Eine Erfassungsgruppe markiert ihren Inhalt als einzelne Einheit in der Grammatik für reguläre Ausdrücke und versieht den Zieltext, der dem Inhalt entspricht, mit einer Bezeichnung. Die Bezeichnung, die den einzelnen Erfassungsgruppen zugeordnet ist, ist eine Zahl, die bestimmt wird, indem die öffnenden Klammern, die Erfassungsgruppen markieren, bis einschließlich der öffnenden Klammer, die die aktuelle Erfassungsgruppe markiert, gezählt werden. In dieser Implementierung ist die maximale Anzahl von Erfassungsgruppen 31.

Beispiele:

  • "ab+" entspricht der Zielsequenz "abb", stimmt jedoch nicht mit der Zielsequenz "abab" überein.

  • "(ab)+" entspricht nicht der Zielsequenz "abb", stimmt jedoch mit der Zielsequenz "abab" überein.

  • "((a+)(b+))(c+)" entspricht der Zielsequenz "aabbbc" und ordnet die Erfassungsgruppe 1 der Untersequenz "aabbb", die Erfassungsgruppe 2 der Untersequenz "aa", die Erfassungsgruppe 3 der Untersequenz "bbb" und die Erfassungsgruppe 4 der Untersequenz "c" zu.

Zeichenklasse

Eine Zeichenklasse in einem Klammerausdruck fügt alle Zeichen in der benannten Klasse dem Zeichensatz hinzu, der durch den Klammerausdruck definiert wird. Um eine Zeichenklasse zu erstellen, verwenden Sie "[:" gefolgt vom Namen der Klasse, auf den ":]" folgt. Intern werden Namen von Zeichenklassen erkannt, indem id = traits.lookup_classname aufgerufen wird. Ein Zeichen ch gehört einer solchen Klasse an, wenn traits.isctype(ch, id) "true" zurückgibt. Die standardmäßige regex_traits-Vorlage unterstützt die Klassennamen in der folgenden Tabelle.

Klassenname

Beschreibung

"alnum"

Kleinbuchstaben, Großbuchstaben und Ziffern

"alpha"

Kleinbuchstaben und Großbuchstaben

"blank"

Leerzeichen oder Tabstopp

"STRG"

Die Dateiformat-Escapezeichen

"digit"

Ziffern

"graph"

Kleinbuchstaben, Großbuchstaben, Ziffern und Interpunktion

"lower"

Kleinbuchstaben

"print"

Kleinbuchstaben, Großbuchstaben, Ziffern, Interpunktion und Leerzeichen

"punct"

Interpunktion

"space"

space

"upper"

Großbuchstaben

"xdigit"

Ziffern, "a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"

"d"

wie "digit"

"s"

wie "space"

"w"

wie "alnum"

Zeichenbereich

Ein Zeichenbereich in einem Klammerausdruck fügt alle Zeichen in dem Bereich dem Zeichensatz hinzu, der durch den Klammerausdruck definiert wird. Um einen Zeichenbereich zu erstellen, platzieren Sie das Zeichen "-" zwischen das erste und letzte Zeichen im Bereich. Damit werden alle Zeichen in den Satz aufgenommen, die einen numerischen Wert haben, der größer oder gleich dem numerischen Wert des ersten Zeichens und kleiner oder gleich dem numerischen Wert des letzten Zeichen ist. Beachten Sie, dass dieser Satz von hinzugefügten Zeichen von der plattformspezifischen Darstellung der Zeichen abhängt. Wenn das Zeichen "-" am Anfang oder am Ende eines Klammerausdrucks oder als erstes oder letztes Zeichen des Zeichenbereichs auftritt, stellt es sich selbst dar.

Beispiele:

  • "[0-7]" stellt den Satz von Zeichen dar {"0", "1", "2", "3", "4", "5", "6", "7"}. Der Ausdruck entspricht den Zielsequenzen "0", "1" usw., nicht jedoch "a".

  • Auf Systemen, die die ASCII-Zeichencodierung verwenden, stellt "[h-k]" den Satz von Zeichen {"h", "i", "j", "k"} dar. Der Ausdruck entspricht den Zielsequenzen "h", "i" usw., jedoch nicht "\x8A" oder "0".

  • Auf Systemen, die die EBCDIC-Zeichencodierung verwenden, stellt "[h-k]" den Satz von Zeichen { "h", "i", "\x8A", "\x8B", "\x8C", "\x8D", "\x8E", "\x8F", "\x90", "j", "k" } dar ("h" wird als 0x88 und "k" als 0x92 codiert). Der Ausdruck entspricht den Zielsequenzen "h", "i", "\x8A" usw., jedoch nicht "0".

  • "[-0-24]" stellt den Satz von Zeichen {"-", "0", "1", "2", "3", "4"} dar.

  • "[0-2-]" stellt den Satz von Zeichen {"0", "1", "2", "-"} dar.

  • Auf Systemen, die die ASCII-Zeichencodierung verwenden, stellt "[+--]" den Satz von Zeichen {"+", ",", "-"} dar.

Wenn gebietsschemaabhängige Bereiche verwendet werden, werden die Zeichen in einem Bereich von den Sortierreihenfolgenregeln für das Gebietsschema bestimmt. Zeichen, die nach dem ersten Zeichen in der Definition des Bereichs und vor das letzte Zeichen der Definition des Bereichs sortiert werden, befinden sich im Satz. Die beiden Endzeichen befinden sich ebenfalls im Satz.

Sortierungselement

Ein Sortierungselement ist eine Sequenz mit mehreren Zeichen, die als einzelnes Zeichen behandelt wird.

Sortierungssymbol

Ein Sortierungssymbol in einem Klammerausdruck fügt dem Satz, der durch den Klammerausdruck definiert wird, ein Sortierungselement hinzu. Um ein Sortierungssymbol zu erstellen, verwenden Sie "[." gefolgt vom Sortierungselement, auf das ".]" folgt.

Escapesequenz für Steuerzeichen

Eine Escapesequenz für Steuerzeichen ist ein umgekehrter Schrägstrich gefolgt vom Buchstaben "c", auf den einer der Buchstaben "a" bis "z" oder "A" bis "Z" folgt. Sie entspricht dem ASCII-Steuerzeichen, das von diesen Buchstaben benannt wird. Beispielsweise entspricht "\ci" der Zielsequenz "\x09", da <STRG-i> den Wert 0x09 hat.

DSW-Escapezeichen

Ein DSW-Escapezeichen ist ein Kurzname für eine Zeichenklasse, wie in der folgenden Tabelle dargestellt.

Escapesequenz

Äquivalente benannte Klasse

Standardmäßige benannte Klasse

"\d"

"[[:d:]]"

"[[:digit:]]"

"\D"

"[^[:d:]]"

"[^[:digit:]]"

"\s"

"[[:s:]]"

"[[:space:]]"

"\S"

"[^[:s:]]"

"[^[:space:]]"

"\w"

"[[:w:]]"

"[a-zA-Z0-9_]"*

"\W"

"[^[:w:]]"

"[^a-zA-Z0-9_]"*

*ASCII-Zeichensatz

Äquivalenzklasse

Eine Äquivalenzklasse in einem Klammerausdruck fügt dem Satz, der durch den Klammerausdruck definiert wird, alle Zeichen und Sortierungselemente hinzu, die dem Sortierungselement in der Äquivalenzklassendefinition entsprechen. Um eine Äquivalenzklasse zu erstellen, verwenden Sie "[=" gefolgt von einem Sortierungselement, auf das "=]" folgt. Intern sind zwei Sortierungselemente elt1 und elt2 äquivalent, wenn traits.transform_primary(elt1.begin(), elt1.end()) == traits.transform_primary(elt2.begin(), elt2.end()).

Dateiformat-Escapezeichen

Ein Dateiformat-Escapezeichen besteht aus den üblichen Escapezeichensequenzen der C-Programmiersprache "\\", "\a", "\b", "\f", "\n", "\r", "\t", "\v". Diese haben die üblichen Bedeutungen, d. h umgekehrter Schrägstrich, Warnmeldung, Rücktaste, Seitenvorschub, Zeilenvorschub, Wagenrücklauf, horizontaler bzw. vertikaler Tabulator. In ECMAScript sind "\a" und "\b" nicht zulässig. ("\\" ist zulässig, es handelt sich jedoch um ein Identitätsescapezeichen, nicht um ein Dateiformat-Escapezeichen.)

Hexadezimale Escapesequenz

Eine hexadezimale Escapesequenz ist ein umgekehrter Schrägstrich, gefolgt vom Buchstaben "x", auf den zwei hexadezimale Ziffern (0-9a-fA-F) folgen. Sie entspricht einem Zeichen in der Zielsequenz mit dem Wert, der durch die zwei Ziffern angegeben wird. Beispielsweise entspricht "\x41" der Zielsequenz "A", wenn die ASCII-Zeichencodierung verwendet wird.

Identitätsescapezeichen

Ein Identitätsescapezeichen ist ein umgekehrter Schrägstrich, auf den ein einzelnes Zeichen folgt. Es entspricht diesem Zeichen. Das Escapezeichen ist erforderlich, wenn das Zeichen eine besondere Bedeutung hat. Durch das Identitätsescapezeichen wird die besondere Bedeutung aufgehoben. Beispiel:

  • "a*" entspricht der Zielsequenz "aaa", stimmt jedoch nicht mit der Zielsequenz "a*" überein.

  • "a\*" entspricht der Zielsequenz "aaa" nicht, stimmt jedoch mit der Zielsequenz "a*" überein.

Der Satz von Zeichen, die in einem Identitätsescapezeichen zulässig sind, hängt von der Grammatik für die regulären Ausdrücke ab, wie in der folgenden Tabelle dargestellt.

Grammatik

Zulässige Identitätsescapezeichen

BRE, grep

{ '(', ')', '{', '}', '.', '[', '\', '*', '^', '$' }

ERE, egre

{ '(', ')', '{', '.', '[', '\', '*', '^', '$', '+', '?', '|' }

awk

ERE plus { '"', '/' }

ECMAScript

Alle Zeichen außer denjenigen, die Bestandteil eines Bezeichners sein können. In der Regel umfasst dies Buchstaben, Ziffern, "$", "_" und Unicode-Escapesequenzen. Weitere Informationen finden Sie in der ECMAScript-Sprachspezifikation.

Einzelnes Zeichen

Ein einzelnes Zeichen in einem Klammerausdruck fügt dieses Zeichen dem Zeichensatz hinzu, der durch den Klammerausdruck definiert wird. Überall in einem Klammerausdruck, außer zu Beginn, stellt sicher ein "^" selbst dar.

Beispiele:

  • "[abc]" entspricht den Zielsequenzen "a", "b" und "c", nicht jedoch der Sequenz "d".

  • "[^abc]" entspricht der Zielsequenz "d", jedoch nicht den Zielsequenzen "a", "b" oder "c".

  • "[a^bc]" entspricht den Zielsequenzen "a", "b", "c" und "^", jedoch nicht der Zielsequenz "d".

In allen Grammatiken für reguläre Ausdrücke außer ECMAScript gilt: Wenn "]" das erste Zeichen ist, das der öffnenden Klammer "[" folgt, oder das erste Zeichen, das einem anfänglichen Zeichen "^" folgt, stellt es sich selbst dar.

Beispiele:

  • "[]a" ist ungültig, da es kein "]" gibt, um den Klammerausdruck zu beenden.

  • "[]abc]" entspricht den Zielsequenzen "a", "b", "c" und "]", jedoch nicht der Zielsequenz "d".

  • "[^]abc]" entspricht der Zielsequenz "d", jedoch nicht den Zielsequenzen "a", "b", "c" oder "]".

In ECMAScript verwenden Sie " \]", um das Zeichen "]" in einem Klammerausdruck darzustellen.

Beispiele:

  • "[]a" entspricht der Zielsequenz "a", da der Klammerausdruck leer ist.

  • "[\]abc]" entspricht den Zielsequenzen "a", "b", "c" und "]", jedoch nicht der Zielsequenz "d".

Negative Assertion

Eine negative Assertion entspricht allem, außer ihrem Inhalt. Sie verarbeitet keine Zeichen in der Zielsequenz. Beispiel: "(?!aa)(a*)" entspricht der Zielsequenz "a" und ordnet die Erfassungsgruppe 1 der Untersequenz "a" zu. Die Sequenz entspricht nicht der Zielsequenz "aa" oder der Zielsequenz "aaa".

Negative Wortgrenzenassertion

Eine negative Wortgrenzenassertion stimmt überein, wenn die aktuelle Position in der Zielzeichenfolge nicht unmittelbar hinter einer Wortgrenze liegt.

Nichterfassungsgruppe

Eine Nichterfassungsgruppe markiert ihren Inhalt als einzelne Einheit in der Grammatik für reguläre Ausdrücke, versieht den Zieltext jedoch nicht mit einer Bezeichnung. Beispiel: "(a)(?:b)*(c)" entspricht dem Zieltext "abbc" und ordnet die Erfassungsgruppe 1 der Untersequenz "a" und die Erfassungsgruppe 2 der Untersequenz "c" zu.

Nicht gierige Wiederholung

Eine nicht gierige Wiederholung nutzt die kürzeste Untersequenz der Zielsequenz, die dem Muster entspricht. Eine gierige Wiederholung verwendet die längste Untersequenz. Beispiel: "(a+)(a*b)" entspricht der Zielsequenz "aaab". Wenn eine nicht gierige Wiederholung verwendet wird, wird die Erfassungsgruppe 1 der Untersequenz "a" am Anfang der Zielsequenz und die Erfassungsgruppe 2 der Untersequenz "aab" am Ende der Zielsequenz zugeordnet. Wenn eine gierige Übereinstimmung verwendet wird, wird die Erfassungsgruppe 1 der Untersequenz "aaa" und die Erfassungsgruppe 2 der Untersequenz "b" zugeordnet.

Oktale Escapesequenz

Eine oktale Escapesequenz ist ein umgekehrter Schrägstrich, gefolgt von einer, zwei oder drei Oktalziffern (0-7). Sie entspricht einem Zeichen in der Zielsequenz mit dem Wert, der durch diese Ziffern angegeben wird. Wenn alle Ziffern "0 " sind, ist die Sequenz ungültig. Beispielsweise entspricht "\101" der Zielsequenz "A", wenn die ASCII-Zeichencodierung verwendet wird.

Normales Zeichen

Ein normales Zeichen ist ein beliebiges gültiges Zeichen, das in der aktuellen Grammatik keine besondere Bedeutung hat.

In ECMAScript haben die folgenden Zeichen eine besondere Bedeutung:

  • ^ $ \ . * + ? ( ) [ ] { } |

In BRE und grep haben die folgenden Zeichen eine besondere Bedeutung:

  • . [ \

In BRE und grep verfügen die folgenden Zeichen außerdem über eine besondere Bedeutung, wenn sie in einem bestimmten Kontext verwendet werden:

  • "*" hat in jedem Fall eine besondere Bedeutung, außer wenn es sich um das erste Zeichen in einem regulären Ausdruck oder das erste Zeichen handelt, das einem anfänglichen "^" in einem regulären Ausdruck folgt, oder wenn es das erste Zeichen einer Erfassungsgruppe oder das erste Zeichen ist, das dem anfänglichen "^" in einer Erfassungsgruppe folgt.

  • "^" hat eine besondere Bedeutung, wenn es das erste Zeichen eines regulären Ausdrucks ist.

  • "$" hat eine besondere Bedeutung, wenn es das letzte Zeichen eines regulären Ausdrucks ist.

In ERE, egrep und awk haben die folgenden Zeichen eine besondere Bedeutung:

  • . [ \ ( * + ? { |

In ERE, egrep und awk verfügen die folgenden Zeichen außerdem über eine besondere Bedeutung, wenn sie in einem bestimmten Kontext verwendet werden:

  • ')' hat eine besondere Bedeutung, wenn es einem vorhergehenden '(' entspricht.

  • "^" hat eine besondere Bedeutung, wenn es das erste Zeichen eines regulären Ausdrucks ist.

  • "$" hat eine besondere Bedeutung, wenn es das letzte Zeichen eines regulären Ausdrucks ist.

Ein normales Zeichen entspricht dem gleichen Zeichen in der Zielsequenz. Standardmäßig heißt das, dass die Übereinstimmung erfolgreich ist, wenn die beiden Zeichen durch den gleichen Wert dargestellt werden. In einer Übereinstimmung ohne Beachtung der Groß-/Kleinschreibung stimmen zwei Zeichen ch0 und ch1 überein, wenn traits.translate_nocase(ch0) == traits.translate_nocase(ch1). In einer Übereinstimmung unter Beachtung des Gebietsschemas stimmen zwei Zeichen ch0 und ch1 überein, wenn traits.translate(ch0) == traits.translate(ch1).

Positive Assertion

Eine positive Assertion entspricht ihrem Inhalt, verwendet jedoch keine Zeichen in der Zielsequenz.

Beispiele:

  • "(?=aa)(a*)" entspricht der Zielsequenz "aaaa" und ordnet die Erfassungsgruppe 1 der Untersequenz "aaaa" zu.

  • "(aa)(a*)" entspricht der Zielsequenz "aaaa" und ordnet die Erfassungsgruppe 1 der Untersequenz "aa" am Anfang der Zielsequenz und die Erfassungsgruppe 2 der Untersequenz "aa" am Ende der Zielsequenz zu.

  • "(?=aa)(a)|(a)" entspricht der Zielsequenz "a" und ordnet die Erfassungsgruppe 1 einer leeren Sequenz (aufgrund eines Fehlers bei der positiven Assertion) und die Erfassungsgruppe 2 der Untersequenz "a" zu. Außerdem entspricht die Zielsequenz "aa" und ordnet die Erfassungsgruppe 1 der Untersequenz "aa" und die Erfassungsgruppe 2 einer leeren Sequenz zu.

Unicode-Escapesequenz

Eine Unicode-Escapesequenz ist ein umgekehrter Schrägstrich, gefolgt vom Buchstaben "u", auf den vier hexadezimale Ziffern (0-9a-fA-F) folgen. Sie entspricht einem Zeichen in der Zielsequenz mit dem Wert, der durch die vier Ziffern angegeben wird. Beispielsweise entspricht "\u0041" der Zielsequenz "A", wenn die ASCII-Zeichencodierung verwendet wird.

Platzhalterzeichen

Ein Platzhalterzeichen entspricht jedem Zeichen im Zielausdruck außer einem Zeilenumbruch.

Wortgrenze

Eine Wortgrenze tritt in den folgenden Fällen auf:

  • Das aktuelle Zeichen befindet sich am Anfang der Zielsequenz und ist eines der Wortzeichen A-Za-z0-9_.

  • Die aktuelle Zeichenposition liegt hinter dem Ende der Zielsequenz und das letzte Zeichen der Zielsequenz ist eines der Wortzeichen.

  • Das aktuelle Zeichen ist eines der Wortzeichen und das vorherige Zeichen nicht.

  • Das aktuelle Zeichen ist keines der Wortzeichen und das vorherige Zeichen ist ein Wortzeichen.

Wortgrenzenassertion

Eine Wortgrenzenassertion stimmt überein, wenn die aktuelle Position in der Zielzeichenfolge nicht unmittelbar hinter einer Wortgrenze liegt.

Zuordnen und Suchen

Damit ein regulärer Ausdruck einer Zielsequenz entspricht, muss der gesamte reguläre Ausdruck mit der gesamten Zielsequenz übereinstimmen. Beispielsweise entspricht der reguläre Ausdruck "bcd" der Zielsequenz "bcd", stimmt jedoch weder mit der Zielsequenz "abcd" noch mit der Zielsequenz "bcde" überein.

Damit eine Suche mit regulärem Ausdruck erfolgt, muss eine Untersequenz in der Zielsequenz vorhanden sein, die dem regulären Ausdruck entspricht. Die Suche ergibt in der Regel die äußerst linke entsprechende Untersequenz.

Beispiele:

  • Eine Suche nach dem regulären Ausdruck "bcd" in der Zielsequenz "bcd" ist erfolgreich und entspricht der gesamten Sequenz. Die gleiche Suche in der Zielsequenz "abcd" ist auch erfolgreich und stimmt mit den letzten drei Zeichen überein. Die gleiche Suche in der Zielsequenz "bcde" ist auch erfolgreich und stimmt mit den ersten drei Zeichen überein.

  • Eine Suche nach dem regulären Ausdruck "bcd" in der Zielsequenz "bcdbcd" ist erfolgreich und stimmt mit den ersten drei Zeichen überein.

Wenn es mehr als eine Untersequenz gibt, die mit einer Position in der Zielsequenz übereinstimmt, gibt es zwei Möglichkeiten, das entsprechende Muster auszuwählen. Die erste Übereinstimmung wählt die Untersequenz aus, die zuerst gefunden wurde, wenn der reguläre Ausdruck übereinstimmt. Längste Übereinstimmung wählt die längste Untersequenz aus den Sequenzen aus, die an dieser Position übereinstimmen. Wenn es mehr als eine Untersequenz gibt, die die maximale Länge hat, wird mit der längsten Übereinstimmung diejenige ausgewählt, die zuerst gefunden wurde. Wenn die erste Übereinstimmung verwendet wird, ergibt eine Suche nach dem regulären Ausdruck "b|bc" in der Zielsequenz "abcd" die Untersequenz "b", da der linke Alternierungsausdruck dieser Untersequenz entspricht. Daher berücksichtigt diese Methode den rechten Alternierungsausdruck nicht. Wenn die längste Übereinstimmung verwendet wird, ergibt die gleiche Suche "bc", da "bc" länger als "b" ist.

Eine partielle Übereinstimmung ist erfolgreich, wenn die Übereinstimmung das Ende der Zielsequenz ohne Fehler erreicht, auch wenn sie das Ende des regulären Ausdruck nicht erreicht hat. Nachdem eine partielle Übereinstimmung erfolgreich ist, kann das Anhängen von Zeichen an die Zielsequenz daher dazu führen, dass bei einer späteren partiellen Übereinstimmung ein Fehler auftritt. Nachdem ein Fehler bei einer partiellen Übereinstimmung aufgetreten ist, kann das Anhängen von Zeichen an die Zielsequenz nicht dazu führen, dass eine spätere partielle Übereinstimmung erfolgreich ist. Beispielsweise entspricht "ab" bei einer partiellen Übereinstimmung der Zielsequenz "a", jedoch nicht "ac".

Formatflags

ECMAScript-Formatierungsregeln

sed-Formatierungsregeln

Ersetzungstext

"$&"

"&"

Die Zeichensequenz, die dem gesamten regulären Ausdruck entspricht ([match[0].first, match[0].second))

"$$"

"$"

 

"\&"

"&"

"$`" (Dollarzeichen gefolgt vom Graviszeichen)

 

Die Zeichensequenz, die der Untersequenz vorausgeht, die dem regulären Ausdruck entspricht ([match.prefix().first, match.prefix().second))

"$ '" (Dollarzeichen gefolgt vom Vorwärtsanführungszeichen)

 

Die Zeichensequenz, die der Untersequenz folgt, die dem regulären Ausdruck entspricht ([match.suffix().first, match.suffix().second))

"$n"

"\n"

Die Zeichensequenz, die der Erfassungsgruppe in Position n entspricht, wobei n eine Zahl zwischen 0 und 9 ist ([match[n].first, match[n].second)

 

"\\n"

"\n"

"$nn"

 

Die Zeichensequenz, die der Erfassungsgruppe in Position nn entspricht, wobei nn eine Zahl zwischen 10 und 99 ist ([match[nn].first, match[nn].second)

Siehe auch

Referenz

Übersicht über die C++-Standardbibliothek