namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:lib:regex_replace

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 rrichter