kennen:lib:regex_replace
Inhaltsverzeichnis
regex_replace()
#include
<regex>
string regex_replace(const string& s, const regex& e, const string& fmt, match_flag_type flags = match_default) Out regex_replace(Out out, Bi first, Bi last, const regex& e, const string& fmt, match_flag_type flags = match_default)
Ersetzt Übereinstimmungen eines Zeichenbereiches [first,last) bzw. der Zeichenkette s
mit dem regulären Ausdruck e
durch den Inhalt der Zeichenkette fmt
.
Die Funktionen sind als Schablonen definiert. Neben den hier angegebenen existieren Varianten für char
-Felder und std::wstring
.
Parameter
out | Iterator auf Anfang des Zielbereichs |
first , last | Iteratorbereich in Zeichenkette |
s | zu durchmusternde Zeichenkette |
fmt | einzusetzende Zeichenfolge |
e | regulärer Ausdruck |
flags | Optionen für die Durchmusterung |
In der Ersatzzeichenkette können Verweise auf gefundene Teilzeichenketten1) eingebaut werden:
$& | gesamte gefundene Zeichenkette |
$´ | Zeichen vor der gefundenen Zeichenkette |
$' | Zeichen nach der gefundenen Zeichenkette |
$1 bis $nn | 1. bis nn-te (max. 99.) Untergruppe des regulären Ausdrucks |
$$ | Zeichen $ allein |
Optionen der Durchmusterung sind in std::regex_constants definiert.
Ergebnis
Rückgabewert: Zeichenkette bzw. Iterator auf das Ende des Bereiches mit der umgewandelten Zeichenfolge.
Siehe auch
Beispiel
- regex_replace.cpp
#include <iostream> #include <regex> #include <string> auto date_to_yyyymmdd(std::string text0) { auto rex1 = R"((\d{1,2})(\.\s|[\.|/|\-])(\d{1,2})(\.\s|[\.|/|\-])(\d{4}))"; auto fmt1 = "$5-$3-$1"; auto rex2 = R"((\d{4})-(\d{1})-(\d{1,2}))"; auto fmt2 = "$1-0$2-$3"; auto rex3 = R"((\d{4})-(\d{2})-(\d{1})($|\D))"; auto fmt3 = "$1-$2-0$3$4"; auto text1 = std::regex_replace(text0, std::regex{rex1}, fmt1); // order by y-m-d auto text2 = std::regex_replace(text1, std::regex{rex2}, fmt2); // add starting zero, if one digit month auto text3 = std::regex_replace(text2, std::regex{rex3}, fmt3); // add starting zero, if one digit day return text3; } int main() { std::cout << date_to_yyyymmdd("Datum: 29. 03. 2019") << '\n' ; std::cout << date_to_yyyymmdd("Datum: 29. 3. 2019") << '\n' ; std::cout << date_to_yyyymmdd("Datum: 29.3.2019") << '\n' ; std::cout << date_to_yyyymmdd("Datum: 29.03.2019") << '\n' ; std::cout << date_to_yyyymmdd("Datum: 29-03-2019") << '\n' ; std::cout << date_to_yyyymmdd("Datum: 29/03/2019") << '\n' ; std::cout << date_to_yyyymmdd("Datum: 29/3/2019") << '\n' ; std::cout << date_to_yyyymmdd("Datum: 2. 3. 2019") << '\n' ; std::cout << date_to_yyyymmdd("Datum: 2.3.2019") << '\n' ; std::cout << date_to_yyyymmdd("Datum: 2-3-2019") << '\n' ; std::cout << date_to_yyyymmdd("Datum: 2/3/2019") << '\n' ; std::cout << date_to_yyyymmdd("Datum: 3/12/2019") << '\n' ; }
1)
Der C++-Standard bezieht sich auch 2020 noch auf ECMA-262, 3rd edition (1999),
siehe auch ECMAScript 2018 §21.1.3.16, Tbl. 48.
kennen/lib/regex_replace.txt · Zuletzt geändert: 2019-03-31 18:36 von 127.0.0.1