Namensräume
Varianten
Aktionen

std::regex_constants::syntax_option_type

Von cppreference.com
< cpp‎ | regex
 
 
 
Bibliothek für reguläre Ausdrücke
Klassen
(C++11)
Algorithmen
Iteratoren
Ausnahmen
Traits
Konstanten
syntax_option_type
(C++11)
(C++11)
Reguläre Ausdrucksgrammatiken
 
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 */;
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 von regulären Ausdrücken steuern.
2,3) Die möglichen Werte (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

Objekt für reguläre Ausdrücke
(Klassenvorlage) [bearbeiten]