Namespaces
Variants

std::regex_constants:: syntax_option_type

From cppreference.net
Definiert im Header <regex>
using syntax_option_type = /* implementierungsdefiniert */ ;
(1) (seit C++11)
constexpr syntax_option_type icase = /* nicht spezifiziert */ ;

constexpr syntax_option_type nosubs = /* nicht spezifiziert */ ;
constexpr syntax_option_type optimize = /* nicht spezifiziert */ ;
constexpr syntax_option_type collate = /* nicht spezifiziert */ ;
constexpr syntax_option_type ECMAScript = /* nicht spezifiziert */ ;
constexpr syntax_option_type basic = /* nicht spezifiziert */ ;
constexpr syntax_option_type extended = /* nicht spezifiziert */ ;
constexpr syntax_option_type awk = /* nicht spezifiziert */ ;
constexpr syntax_option_type grep = /* nicht spezifiziert */ ;

constexpr syntax_option_type egrep = /* nicht spezifiziert */ ;
(2) (seit C++11)
(inline seit C++17)
inline constexpr syntax_option_type multiline = /* nicht spezifiziert */ ;
(3) (seit C++17)
1) Der syntax_option_type ist ein BitmaskType , der Optionen enthält, die das Verhalten regulärer Ausdrücke steuern.
2,3) Die möglichen Werte ( icase , optimize , etc.) für Typ (1) sind innerhalb von std::basic_regex dupliziert.

Inhaltsverzeichnis

Konstanten

Grammatik-Option Effekt(e)
ECMAScript Verwendet die modifizierte ECMAScript-Regular-Expression-Grammatik .
basic Verwendet die grundlegende POSIX-Regular-Expression-Grammatik ( Grammatik-Dokumentation ).
extended Verwendet die erweiterte POSIX-Regular-Expression-Grammatik ( Grammatik-Dokumentation ).
awk Verwendet die Regular-Expression-Grammatik, die vom awk -Utility in POSIX verwendet wird ( Grammatik-Dokumentation ).
grep Verwendet die Regular-Expression-Grammatik, die vom grep -Utility in POSIX verwendet wird. Dies ist effektiv dasselbe wie die basic -Option mit der Ergänzung von Newline ' \n ' als Alternationstrennzeichen.
egrep Verwendet die Regular-Expression-Grammatik, die vom grep -Utility mit der -E -Option in POSIX verwendet wird. Dies ist effektiv dasselbe wie die extended -Option mit der Ergänzung von Newline ' \n ' als zusätzliches Alternationstrennzeichen neben '|' .
Grammatik-Variante Effekt(e)
icase Zeichenvergleiche sollten ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt werden.
nosubs Bei der Durchführung von Übereinstimmungen werden alle markierten Teilausdrücke ( expr ) als nicht-markierende Teilausdrücke (?: expr ) behandelt. Keine Übereinstimmungen werden in der bereitgestellten std::regex_match -Struktur gespeichert und mark_count() ist null.
optimize Weist die Regular-Expression-Engine an, das Matching zu beschleunigen, mit potenziellen Kosten einer langsameren Konstruktion. Dies könnte beispielsweise bedeuten, einen nicht-deterministischen FSA in einen deterministischen FSA umzuwandeln.
collate Zeichenbereiche der Form "[a-b]" werden lokalisierungssensitiv sein.
multiline (C++17) Legt fest, dass ^ den Anfang einer Zeile und $ das Ende einer Zeile entsprechen soll, wenn die ECMAScript-Engine ausgewählt ist.

Höchstens eine Grammatikoption kann ausgewählt werden aus ECMAScript , basic , extended , awk , grep , egrep . Wenn keine Grammatik gewählt wird, wird ECMAScript als ausgewählt angenommen. Die anderen Optionen dienen als Varianten, sodass std:: regex ( "meow" , std :: regex :: icase ) äquivalent ist zu std:: regex ( "meow" , std :: regex :: ECMAScript | std :: regex :: icase ) .

Hinweise

Da POSIX die "Leftmost Longest"-Matching-Regel verwendet (die längste übereinstimmende Teilsequenz wird gematcht, und wenn es mehrere solcher Teilsequenzen gibt, wird die erste gematcht), ist es beispielsweise nicht geeignet für das Parsen von Auszeichnungssprachen: Ein POSIX-Regex wie "<tag[^>]*>.*</tag>" würde alles vom ersten "<tag" bis zum letzten "</tag>" matchen, einschließlich jedes "</tag>" und "<tag>" dazwischen. Andererseits unterstützt ECMAScript nicht-gierige Matches, und der ECMAScript-Regex "<tag[^>]*>.*?</tag>" würde nur bis zum ersten schließenden Tag matchen.

Beispiel

Veranschaulicht den Unterschied im Matching-Algorithmus 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

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 wurden als static deklariert entfernte den static Spezifizierer

Siehe auch

Regulärer Ausdruck-Objekt
(Klassentemplate)