std::regex_constants::syntax_option_type
| Definiert in Header <regex> |
||
| using syntax_option_type = /* implementierungsspezifisch */; |
(1) | (seit C++11) |
| constexpr syntax_option_type icase = /* nicht spezifiziert */; constexpr syntax_option_type nosubs = /* nicht spezifiziert */; |
(2) | (seit C++11) (inline seit C++17) |
| inline constexpr syntax_option_type multiline = /* nicht spezifiziert */; |
(3) | (seit C++17) |
syntax_option_type ist ein BitmaskType, der Optionen enthält, die das Verhalten von regulären Ausdrücken steuern.icase, optimize, etc.) für den Typ (1) sind innerhalb von std::basic_regex dupliziert.Inhalt |
[bearbeiten] Konstanten
| Grammatik-Option | Effekt(e) |
ECMAScript
|
Verwendet die modifizierte ECMAScript-Grammatik für reguläre Ausdrücke. |
basic
|
Verwendet die grundlegende POSIX-Grammatik für reguläre Ausdrücke (Grammatikdokumentation). |
extended
|
Verwendet die erweiterte POSIX-Grammatik für reguläre Ausdrücke (Grammatikdokumentation). |
awk
|
Verwendet die Grammatik für reguläre Ausdrücke, die vom awk-Dienstprogramm in POSIX verwendet wird (Grammatikdokumentation). |
grep
|
Verwendet die Grammatik für reguläre Ausdrücke, die vom grep-Dienstprogramm in POSIX verwendet wird. Dies ist im Wesentlichen dieselbe wie die Option basic, mit dem Zusatz, dass der Zeilenumbruch '\n' als Alternativseparator verwendet wird. |
egrep
|
Verwendet die Grammatik für reguläre Ausdrücke, die vom grep-Dienstprogramm mit der Option -E in POSIX verwendet wird. Dies ist im Wesentlichen dieselbe wie die Option extended, mit dem Zusatz, dass der Zeilenumbruch '\n' als Alternativseparator zusätzlich zu '|' verwendet wird. |
| Grammatik-Variante | Effekt(e) |
icase
|
Die Zeichenübereinstimmung sollte ohne Berücksichtigung der Groß- und Kleinschreibung erfolgen. |
nosubs
|
Beim Ausführen von Übereinstimmungen werden alle markierten Unterausdrücke (expr) als nicht-markierende Unterausdrücke (?:expr) behandelt. Es werden keine Übereinstimmungen in der bereitgestellten std::regex_match-Struktur gespeichert und mark_count() ist null. |
optimize
|
Weist die Regex-Engine an, den Abgleich zu beschleunigen, potenziell auf Kosten einer langsameren Konstruktion. Dies kann zum Beispiel die Umwandlung eines nichtdeterministischen Endlichen Automaten (NEA) in einen deterministischen Endlichen Automaten (DEA) bedeuten. |
collate
|
Zeichenbereiche der Form "[a-b]" sind locale-sensitiv. |
multiline (C++17) |
Gibt an, dass ^ den Anfang einer Zeile und $ das Ende einer Zeile abgleichen soll, wenn die ECMAScript-Engine ausgewählt ist. |
Es kann höchstens eine Grammatikoption aus ECMAScript, basic, extended, awk, grep, egrep gewählt werden. Wenn keine Grammatik gewählt wird, wird angenommen, dass ECMAScript ausgewählt ist. Die anderen Optionen dienen als Variationen, sodass std::regex("meow", std::regex::icase) äquivalent zu std::regex("meow", std::regex::ECMAScript|std::regex::icase) ist.
[bearbeiten] Anmerkungen
Da POSIX die Übereinstimmungsregel "linksseitig am längsten" verwendet (die längste übereinstimmende Teilsequenz wird abgeglichen, und wenn es mehrere solche Teilsequenzen gibt, wird die erste abgeglichen), ist sie beispielsweise für das Parsen von Markup-Sprachen nicht geeignet: ein POSIX-Regex wie "<tag[^>]*>.*</tag>" würde alles vom ersten "<tag" bis zum letzten "</tag>" abgleichen, einschließlich jedes "</tag>" und "<tag>" dazwischen. Andererseits unterstützt ECMAScript nicht-gierige Übereinstimmungen, und das ECMAScript-Regex "<tag[^>]*>.*?</tag>" würde nur bis zum ersten schließenden Tag übereinstimmen.
[bearbeiten] Beispiel
Illustriert den Unterschied im Übereinstimmungsalgorithmus zwischen ECMAScript und POSIX regulären Ausdrücken.
#include <iostream> #include <regex> #include <string> int main() { std::string str = "zzxayyzz"; std::regex re1(".*(a|xayy)"); // ECMA std::regex re2(".*(a|xayy)", std::regex::extended); // POSIX std::cout << "Searching for .*(a|xayy) in zzxayyzz:\n"; std::smatch m; std::regex_search(str, m, re1); std::cout << " ECMA (depth first search) match: " << m[0] << '\n'; std::regex_search(str, m, re2); std::cout << " POSIX (leftmost longest) match: " << m[0] << '\n'; }
Ausgabe
Searching for .*(a|xayy) in zzxayyzz: ECMA (depth first search) match: zzxa POSIX (leftmost longest) match: zzxayy
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2053 | C++11 | die Konstanten waren als static deklariert | Der Spezifizierer static wurde entfernt. |
[bearbeiten] Siehe auch
| (C++11) |
Objekt für reguläre Ausdrücke (Klassenvorlage) |