Podstawy ekspresji regularnej w C ++

Podstawy ekspresji regularnej w C ++
Rozważ następujące zdanie w cytatach: „Oto mój człowiek."

Ten ciąg może znajdować się wewnątrz komputera, a użytkownik może chcieć wiedzieć, czy ma słowo „człowiek”. Jeśli ma słowo mężczyzna, może chcieć zmienić słowo „mężczyzna” na „kobietę”; Aby ciąg czytał:

„Oto moja kobieta."

Istnieje wiele innych pragnień, takich jak użytkownika komputera; Niektóre są złożone. Wyrażenie regularne, skrócone, Regex, jest przedmiotem obsługi tych problemów przez komputer. C ++ jest wyposażony w bibliotekę o nazwie Regex. Tak więc program C ++ do obsługi Regex powinien zacząć od:

#włączać
#włączać
za pomocą przestrzeni nazw Std;

Ten artykuł wyjaśnia podstawy ekspresji regularnej w C++.

Treść artykułu

  • Podstawy ekspresji regularnej
  • Wzór
  • Zajęcia postaci
  • Dopasowane białe listy
  • Okres (.) W wzorze
  • Dopasowane powtórzenia
  • Dopasowanie naprzemienności
  • Dopasowanie początku lub końca
  • Grupowanie
  • ICASE i Multiline Regex_Constants
  • Dopasowanie całego celu
  • Obiekt Match_Results
  • Pozycja dopasowania
  • Wyszukaj i wymień
  • Wniosek

Podstawy ekspresji regularnej

Regex

Ciąg taki jak „Oto mój człowiek.”Powyżej znajduje się sekwencja docelowa lub ciąg docelowy lub po prostu cel. „Człowiek”, którego szukano, jest wyrażeniem regularnym lub po prostu Regex.

Dopasowanie

Mówi się, że dopasowanie występuje, gdy znajduje się słowo lub wyrażenie, które jest przeszukiwane. Po dopasowaniu może nastąpić wymiana. Na przykład po tym, jak „mężczyzna” znajduje się powyżej, można go zastąpić „kobietą”.

Proste dopasowanie

Poniższy program pokazuje, jak dopasowane jest słowo „człowiek”.

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

Regex Reg („Man”);
if (Regex_search („Oto mój człowiek.", reg))
Cout << "matched" << endl;
w przeciwnym razie
Cout << "not matched" << endl;
powrót 0;

Funkcja regex_search () zwraca true, jeśli istnieje dopasowanie i zwraca false, jeśli nie wystąpi dopasowanie. Tutaj funkcja przyjmuje dwa argumenty: Pierwszy to ciąg docelowy, a drugi to obiekt Regex. Sam regularność to „człowiek” w podwójnych cytatach. Pierwsza instrukcja w funkcji main () tworzy obiekt Regex. Regex jest typem, a Reg jest obiektem regularnym. Powyższe wyjście programu jest „dopasowane”, ponieważ „człowiek” jest widoczny w ciągu docelowego ciągu. Gdyby „człowiek” nie był widoczny w celu, Regex_Search () zwróciłby false, a wyjście „nie byłyby dopasowane”.

Wyjście następującego kodu jest „nie dopasowane”:

Regex Reg („Man”);
if (regex_search („Oto moje tworzenie.", reg))
Cout << "matched" << endl;
w przeciwnym razie
Cout << "not matched" << endl;

Nie dopasowany, ponieważ „człowieka” Regex nie można było znaleźć w całym ciągu docelowym ”, oto moje tworzenie."

Wzór

Wyrażenie regularne „Człowiek” powyżej, jest bardzo proste. Regeksy zwykle nie są takie proste. Wyrażenia regularne mają metacharakty. Metacharacters to postacie o specjalnych znaczeniach. Metacharacter to postać o postaciach. C ++ Regex Metacharacters to:

^ $ \ . * + ? () [] |

Regex, z metacharacterami lub bez, jest wzorem.

Zajęcia postaci

Nawiasy kwadratowe

Wzór może mieć postacie w nawiasach kwadratowych. Dzięki temu konkretna pozycja w ciągu docelowego pasowałaby do dowolnego z znaków nawiasów kwadratowych. Rozważ następujące cele:

„Kot jest w pokoju."
„Nietoperz jest w pokoju."
„Szczur jest w pokoju."

Regex, [CBR] AT pasowałby do CAT w pierwszym celu. Pasuje do nietoperza w drugim celu. Pasuje do Rat w trzecim celu. Jest tak, ponieważ „kot” lub „nietoperz” lub „szczur” zaczyna się od „c” lub „b” lub „r”. Poniższy segment kodu to ilustruje:

Regex Reg („[CBR] at”);
if (Regex_search („kot jest w pokoju.", reg))
Cout << "matched" << endl;
if (regex_search („nietoperz jest w pokoju.", reg))
Cout << "matched" << endl;
if (regex_search („szczur jest w pokoju.", reg))
Cout << "matched" << endl;

Wyjście to:

dopasowany
dopasowany
dopasowany

Zakres znaków

Klasa, [CBR] we wzorze [CBR], pasowałaby do kilku możliwych znaków w celu. W celu dopasowałoby to „c” lub „b” lub „r”. Jeśli cel nie ma żadnego z „c”, „b” lub „r”, a następnie „AT”, nie byłoby dopasowania.

Niektóre możliwości, takie jak „c” lub „b” lub „r”, istnieją w zakresie. Zakres cyfr, od 0 do 9 ma 10 możliwości, a wzór to [0-9]. Zakres małych alfabetów, od A do Z, ma 26 możliwości, a wzór tego jest [A-Z]. Zakres wielkich alfabetów, od A do Z, ma 26 możliwości, a wzór tego jest [A-Z]. - nie jest oficjalnie metacharacter, ale w nawiasach kwadratowych wskazywałby na zasięg. Tak więc następujące daje dopasowanie:

if (Regex_search („id6id”, Regex („[0-9]”)))))
Cout << "matched" << endl;

Zwróć uwagę, w jaki sposób regex został skonstruowany jako drugi argument. Dopasowanie występuje między cyfrą, 6 w zakresie, od 0 do 9, a 6 w celu „id6ID”. Powyższy kod jest równoważny:

if (Regex_search („id6id”, Regex ("[0123456789]")))))
Cout << "matched" << endl;

Poniższy kod daje dopasowanie:

char str [] = "id6ie";
if (regex_search (str, regex ("[a-z]"))))
Cout << "matched" << endl;

Zauważ, że pierwszym argumentem tutaj jest zmienna ciąg. Mecz jest pomiędzy „I” w [A-Z] i „I” w „Id6ie”.

Nie zapominaj, że zasięg to klasa. Po prawej stronie może być tekst po prawej stronie lub po lewej stronie zakresu. Poniższy kod daje dopasowanie:

if (regex_search ("id2Idpost-95222 -__ ddelink__294_3116034780"> to identyfikator, Regex ("id [0-9] id"))))
Cout << "matched" << endl;

Mecz jest między „id [0-9] id” i „ID2ID”. Reszta ciągu docelowego „IS A ID” nie jest dopasowana w tej sytuacji.

Jako używane w podmiotu wyrażenia regularnego (regularne), klasa słów faktycznie oznacza zestaw. To znaczy jedna z postaci w zestawie jest dopasowanie.

UWAGA: Łącznik - to metacharacter tylko w nawiasach kwadratowych, co wskazuje na zakres. To nie jest metacharacter w Regex, poza kwadratowymi nawiasami.

Negacja

Klasa obejmująca zasięg można zanotować. Oznacza to, że brak znaków w zestawie (klasa) powinien pasować. Jest to wskazane z Metacharacter na początku wzoru klasowego, tuż po otwierającym nawiasach kwadratowych. Tak więc [^0-9] oznacza dopasowanie znaku w odpowiedniej pozycji w celu, który nie jest żadnym znakiem w zakresie, od 0 do 9 włącznie. Zatem następujący kod nie wytworzy dopasowania:

if (Regex_search („0123456789101112”, Regex („[^0-9]”)))))))
Cout << "matched" << endl;
w przeciwnym razie
Cout << "not matched" << endl;

Cyfra w zakresie od 0 do 9 można znaleźć w dowolnej z docelowych pozycji ciągów, „0123456789101112”; Więc nie ma dopasowania - negacja.

Poniższy kod daje dopasowanie:

if (Regex_search („abcDefghij”, Regex ("[^0-9]"))))
Cout << "matched" << endl;

Nie można było znaleźć cyfry w celu „Abcdefghij”; Więc jest dopasowanie.

[A-Z] jest zakresem na zewnątrz [^a-Z]. I tak [^a-Z] jest negacją [a-z].

[A-Z] jest zakresem na zewnątrz [^a-Z]. I tak [^a-Z] jest negacją [a-z].

Istnieją inne negacje.

Dopasowane białe listy

„lub \ t lub \ r lub \ n lub \ f jest postacią. W poniższym kodzie Regex „\ n” pasuje do „\ n” w celu:

if (regex_search (”linii pierwszej.\ r \ nof linia.", Regex (" \ n "))))
Cout << "matched" << endl;

Dopasowanie dowolnego postaci Whitespace

Wzór lub klasa pasująca do dowolnej postaci białej przestrzeni to: [\ t \ r \ n \ f]. W następującym kodzie „jest dopasowane:

if (Regex_search („jeden dwa”, Regex ("[\ t \ r \ n \ f]"))))))
Cout << "matched" << endl;

Dopasowywanie dowolnej postaci innych

Wzór lub klasa pasująca do dowolnego nie biała znak przestrzeni to: [^ \ t \ r \ n \ f]. Poniższy kod daje dopasowanie, ponieważ w celu nie ma białej listy:

if (Regex_search („1234ABCD”, Regex ("[^ \ t \ r \ n \ f]")))))))))
Cout << "matched" << endl;

Okres (.) W wzorze

Okres (.) W wzorze pasuje do dowolnej postaci, w tym samej samej, z wyjątkiem \ n, w celu. Mecz jest wytwarzany w następującym kodzie:

if (Regex_Search („1234ABCD”, Regex (”.")))
Cout << "matched" << endl;

Brak dopasowania wyników w następującym kodzie, ponieważ celem jest „\ n”.

if (Regex_search („\ n”, Regex (”.")))
Cout << "matched" << endl;
w przeciwnym razie
Cout << "not matched" << endl;

Uwaga: Wewnątrz klasy postaci z kwadratowymi nawiasami, okres nie ma specjalnego znaczenia.

Dopasowane powtórzenia

Znak lub grupa znaków może wystąpić więcej niż raz w ciągu docelowego ciągu. Wzór może pasować do tego powtórzenia. Metacharacters, ?, *, +i służą do dopasowania powtórzenia w celu. Jeśli x jest znakiem zainteresowania ciągiem docelowym, wówczas Metacharacters mają następujące znaczenie:

x*: oznacza dopasowanie „x '0 lub więcej razy, i.mi., dowolna liczba razy
x+: oznacza dopasowanie „x” 1 lub więcej razy, i.mi., przynajmniej raz
X? : oznacza dopasowanie „x '0 lub 1 czas
x n,: oznacza dopasowanie „x” co najmniej n lub więcej razy. Zwróć uwagę na przecinek.
x n: dopasuj 'x' dokładnie n czas
x n, m: dopasuj „x” przynajmniej n razy, ale nie więcej niż m.

Te metalowce nazywane są kwantyfikatorami.

Ilustracje

*

* Pasuje do poprzedniej postaci lub poprzedniej grupy, zero lub więcej razy. „O*” pasuje do „O” w „Dog” sznurka docelowego. Pasuje również „OO” w „Book” i „Patrzenie”. Regex, „o*” pasuje do „Boooo” w „The Animal Booooed.". Uwaga: „o*” pasuje do „wykopu”, gdzie „o” występuje zero (lub więcej) czasu.

+

+ Pasuje do poprzedniej postaci lub poprzedniej grupy, 1 lub więcej razy. Porównaj to z zero lub więcej razy dla *. Tak więc Regex, „E+” pasuje do „E” w „Eat”, gdzie „E” pojawia się pewnego razu. „E+” pasuje również do „EE” w „Owce”, gdzie „E” występuje więcej niż jeden raz. Uwaga: „E+” nie pasuje do „wykopu”, ponieważ w „wykopie”, „E” nie występuje przynajmniej raz.

?

? Pasuje do poprzedniej postaci lub poprzedniej grupy, 0 lub 1 czas (i nie więcej). Więc „e?„Dopasowuje„ wykop ”, ponieważ„ e ”występuje w„ dig ”, zero czasu. "mi?„Dopasowuje się do„ Set ”, ponieważ„ E ”występuje w„ Set ”, jeden raz. Uwaga: „E?„Wciąż pasuje do„ Owce ”; Chociaż w „Owce” są dwa „E. Jest tu niuans - patrz później.

N,

Dopasowuje to co najmniej n kolejne powtórzenia poprzedniego charakteru lub poprzedniej grupy. Tak więc Regex, „E 2,” pasuje do dwóch „e” w celu, „owce” i trzy „e” w celu „sheeep”. „E 2,” nie pasuje do „Set”, ponieważ „SET” ma tylko jeden „E”.

N

Dopasowuje to dokładnie n kolejne powtórzenia poprzedniego charakteru lub poprzedniej grupy. Tak więc Regex, „E 2” pasuje do dwóch e w celu „Owce”. „E 2” nie pasuje do „Set”, ponieważ „set” ma tylko jeden „e”. Cóż, „E 2” pasuje do dwóch e w celu „SheeeP”. Jest tu niuans - patrz później.

n, m

Dopasowuje to kilka kolejnych powtórzeń poprzedniej postaci lub poprzedniej grupy, od N do M, włącznie. Tak więc „e 1,3” nic nie pasuje do „wykopu”, który nie ma „e”. Pasuje do jednego „E” w „Set”, dwóch „E -Sheep”, trzech „E” w „Sheeep” i trzech „E” w „Sheeeep”. Na ostatnim meczu jest niuans - patrz później.

Dopasowanie naprzemienności

Rozważ następujący ciąg docelowy na komputerze.

„Farma ma świnie o różnych rozmiarach."

Programista może chcieć wiedzieć, czy ten cel ma „kozę”, „królik” czy „świnia”. Kod byłby następujący:

char str [] = "Farma ma świnie o różnych rozmiarach.";
if (Regex_search (str, Regex („kozła | królik | świnia”))))
Cout << "matched" << endl;
w przeciwnym razie
Cout << "not matched" << endl;

Kod daje dopasowanie. Zwróć uwagę na użycie znaku naprzemiennego, |. Mogą być dwa, trzy, cztery i więcej opcji. C ++ najpierw spróbuje dopasować pierwszą alternatywę „kozę” w każdej pozycji znaku w ciągu docelowego ciągu. Jeśli nie odniesie sukcesu z „kozą”, próbuje następnej alternatywy „królik”. Jeśli nie odniesie sukcesu z „królika”, próbuje kolejnej alternatywy „świnia”. Jeśli „świni” się nie powiedzie, C ++ przechodzi do następnej pozycji w celu i zaczyna od pierwszej alternatywy.

W powyższym kodzie „świnia” jest dopasowana.

Dopasowanie początku lub końca

Początek


Jeśli ^ jest na początku wyrażenia regularności, wówczas początkowy tekst ciąg docelowego może być dopasowany przez Regex. W poniższym kodzie początkiem celu jest „ABC”, który jest dopasowany:

if (Regex_search („ABC i def”, Regex („^abc”))))
Cout << "matched" << endl;

W następującym kodzie nie ma się dopasować:

if (Regex_search („Tak, ABC i def”, Regex („^abc”)))))
Cout << "matched" << endl;
w przeciwnym razie
Cout << "not matched" << endl;

Tutaj „ABC” nie ma na początku celu.

Uwaga: znak CirmaFlex, „^”, jest metacharacter na początku wyrażenia regularności, dopasowując początek sznurka docelowego. Na początku klasy postaci jest nadal metacharacter, gdzie neguje klasę.

Koniec

Jeśli $ znajduje się na końcu regularności, wówczas tekst końcowy ciągów może być dopasowany przez Regex. W poniższym kodzie końcem celu jest „XYZ”, który jest dopasowany:

if (Regex_search („UVW i xyz”, Regex („xyz $”))))
Cout << "matched" << endl;

W następującym kodzie nie ma się dopasować:

if (Regex_search („UVW i xyz final”, Regex („xyz $”))))
Cout << "matched" << endl;
w przeciwnym razie
Cout << "not matched" << endl;

Tutaj „XYZ” nie jest na końcu celu.

Grupowanie

Nawiasy można użyć do grupowania znaków w wzorze. Rozważ następującą regex:

„Koncert (pianista)”

Grupa tutaj jest „pianistka” otoczona metalowcami (i). To właściwie podgrupa, podczas gdy „koncert (pianista)” to cała grupa. Rozważ następujące:

„(Pianista jest dobry)”

Tutaj podgrupa lub pod stringa to: „Pianista jest dobry”.

Podprony z wspólnymi częściami

Księgowy to osoba, która dba o książki. Wyobraź sobie bibliotekę z księgowym i półki z książkami. Załóżmy, że jeden z poniższych docelowych ciągów znajduje się w komputerze:

„Biblioteka ma podziwianą półkę z książkami.";
„Oto księgowy.";
„Księgowy pracuje z półką z książkami.";

Załóżmy, że zainteresowaniem programisty nie jest wiedzieć, które z tych zdań jest na komputerze. Mimo to jego zainteresowaniem jest wiedzieć, czy „półka” lub „księgowy” jest obecny w dowolnym docelowym ciągu w komputerze. W takim przypadku jego regex może być:

„Księgowy | księgowy."

Za pomocą naprzemienności.

Zauważ, że „książka”, która jest wspólna dla obu słów, została wpisana dwukrotnie, w dwóch słowach w wzorze. Aby uniknąć wpisywania „książki” dwukrotnie, Regex byłby lepiej napisany jako:

„Książka (półka | Keeper)”

Tutaj grupa „półka | Keeper” naprzemiennie Metacharacter był nadal używany, ale nie dla dwóch długich słów. Był używany do dwóch końcowych części dwóch długich słów. C ++ traktuje grupę jako byt. Tak więc C ++ będzie szukał „półki” lub „bramkarza”, który pojawi się natychmiast po „książce”. Wyjście następującego kodu jest „dopasowane”:

Char str [] = "Biblioteka ma podziwiany półfelkę z książkami.";
if (Regex_search (str, Regex („Book (półka | Keeper)”)))))
Cout << "matched" << endl;

„Księgarnia”, a nie „księgowy” zostały dopasowane.

ICASE i Multiline Regex_Constants

icase

Dopasowanie jest domyślnie wrażliwe na wielkość liter. Można to jednak uczynić przypadkiem niewrażliwym. Aby to osiągnąć, użyj Regex :: ICASE stała, jak w następującym kodzie:

if (Regex_search („sprzężenie zwrotne”, Regex („Feed”, Regex :: icase)))))
Cout << "matched" << endl;

Wyjście jest „dopasowane”. Tak więc „sprzężenie zwrotne” z wielkim „f” zostało dopasowane przez „paszę” z małymi literami „f”. „Regex :: ICASE” został drugim argumentem konstruktora Regex (). Bez tego oświadczenie nie dałoby dopasowania.

Multiline

Rozważ następujący kod:

char str [] = "linia 1 \ nline 2 \ nline 3";
if (regex_search (str, regex ("^.*$ ")))
Cout << "matched" << endl;
w przeciwnym razie
Cout << "not matched" << endl;

Wyjście jest „nie dopasowane”. Regex, „^.*$, ”Odpowiada ciągowi od początku do końca. ".*”Oznacza dowolny charakter oprócz \ n, zero lub więcej razy. Tak więc z powodu nowej linii (\ n) w celu nie było dopasowania.

Cel to ciąg wielopoziomowy. Aby '.„Aby dopasować nową postać, musi zostać wykonana„ Regex :: MultIlin ”, drugi argument konstrukcji Regex (). Poniższy kod to ilustruje:

char str [] = "linia 1 \ nline 2 \ nline 3";
if (regex_search (str, regex ("^.*$ ", Regex :: MultIlin)))
Cout << "matched" << endl;
w przeciwnym razie
Cout << "not matched" << endl;

Dopasowywanie całego ciągu docelowego

Aby dopasować cały ciąg docelowy, który nie ma nowego znaku (\ n), można użyć funkcji Regex_Match (). Ta funkcja różni się od Regex_Search (). Poniższy kod to ilustruje:

char str [] = "Pierwsza druga trzecia";
if (regex_match (str, regex (”.*drugi.*”)))
Cout << "matched" << endl;

Jest tu mecz. Należy jednak pamiętać, że regularność odpowiada całemu ciągowi docelowi, a ciąg docelowy nie ma żadnego „\ n”.

Obiekt Match_Results

Funkcja Regex_Search () może podjąć argument pomiędzy celem a obiektem Regex. Ten argument jest obiektem MATH_RESULTS. Cały dopasowany ciąg (część) i dopasowane podprony mogą być z nim znane. Ten obiekt jest specjalną tablicą z metodami. Typ obiektu Match_Results to cmatch (dla literałów smyczkowych).

Uzyskiwanie dopasowań

Rozważ następujący kod:

char str [] = "Kobieta, której szukałeś!";
cmatch m;
if (regex_search (str, m, Regex ("w.M.N")))
Cout << m[0] << endl;

Ciąg docelowy ma słowo „kobieta”. Dane wyjściowe to „kobieta”, która odpowiada regexowi ”, w.M.N". W Index Zero tablica specjalna ma jedyny mecz, jakim jest „kobieta”.

Dzięki opcjom klasowym tylko pierwsze podtruing znalezione w celu jest wysyłane do tablicy specjalnej. Poniższy kod to ilustruje:

cmatch m;
if (regex_search („szczur, kot, nietoperz!", m, Regex (" [bcr] at "))))
Cout << m[0] << endl;
Cout << m[1] << endl;
Cout << m[2] << endl;

Dane wyjściowe to „szczur” z indeksu zero. m [1] i m [2] są puste.

Z alternatywami, tylko pierwsze podtruing znalezione w celu jest wysyłane do specjalnej tablicy. Poniższy kod to ilustruje:

if (Regex_search („królik, kozła, świnia!", M, Regex („ kozła | królik | świnia "))))
Cout << m[0] << endl;
Cout << m[1] << endl;
Cout << m[2] << endl;

Wyjście to „królik” z indeksu zero. m [1] i m [2] są puste.

Grupy

Gdy w grę wchodzą grupy, kompletny wzór dopasowany, przechodzi w komórkę zero tablicy specjalnej. Kolejne znalezione podstępie trafia do komórki 1; Podsumowanie podsumowań trafia do komórki 2; i tak dalej. Poniższy kod to ilustruje:

if (Regex_Search („Najlepszy księgarnia dzisiaj!", m, Regex (" Book ((sel) (ler) ")))))
Cout << m[0] << endl;
Cout << m[1] << endl;
Cout << m[2] << endl;
Cout << m[3] << endl;

Wyjście to:

księgarz
sprzedawca
sel
ler

Zauważ, że grupa (sprzedawca) pojawia się przed grupą (SEL).

Pozycja dopasowania

Może być znana pozycja dopasowania dla każdego substringu w tablicy CMatch. Liczenie rozpoczyna się od pierwszego znaku łańcucha docelowego, w pozycji zero. Poniższy kod to ilustruje:

cmatch m;
if (Regex_Search („Najlepszy księgarnia dzisiaj!", m, Regex (" Book ((sel) (ler) ")))))
Cout << m[0] << "->" << m.position(0) << endl;
Cout << m[1] << "->" << m.position(1) << endl;
Cout << m[2] << "->" << m.position(2) << endl;
Cout << m[3] << "->" << m.position(3) << endl;

Zwróć uwagę na użycie właściwości pozycji z indeksem komórki, jako argumentu. Wyjście to:

Księga-> 5
Sprzedawca-> 9
SEL-> 9
LER-> 12

Wyszukaj i wymień

Nowe słowo lub fraza może zastąpić dopasowanie. Do tego używana jest funkcja Regex_replace (). Jednak tym razem ciąg, w którym występuje wymiana, jest obiekt ciągów, a nie literał. Tak więc biblioteka ciągów musi być uwzględniona w programie. Ilustracja:

#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

String str = "tutaj, przychodzi mój człowiek. Idzie twój mężczyzna.";
String Newstr = Regex_replace (str, Regex („Man”), „Woman”);
Cout << newStr << endl;
powrót 0;

Funkcja Regex_replace (), jak kodowano tutaj, zastępuje wszystkie dopasowania. Pierwszym argumentem funkcji jest cel, drugi to obiekt Regex, a trzeci to ciąg zastępczy. Funkcja zwraca nowy ciąg, który jest celem, ale ma wymiana. Wyjście to:

„Nadchodzi moja kobieta. Tam idzie twoja kobieta."

Wniosek

Wyrażenie regularne wykorzystuje wzory do dopasowania podrzędnych w ciągu sekwencji docelowej. Wzory mają metacharakty. Powszechnie używane funkcje dla wyrażeń regularnych C ++, to: Regex_search (), Regex_Match () i Regex_replace (). Regex to wzór w podwójnych cytatach. Jednak funkcje te przyjmują obiekt Regex jako argument, a nie tylko Regex. Regex musi być wykonany w obiekcie wyrażenia regularności, zanim te funkcje będą w stanie z niego skorzystać.