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ćTen artykuł wyjaśnia podstawy ekspresji regularnej w C++.
Treść artykułu
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ć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”);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."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”);Wyjście to:
dopasowanyZakres 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]”)))))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]")))))Poniższy kod daje dopasowanie:
char str [] = "id6ie";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"))))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]”)))))))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]"))))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 "))))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]"))))))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]")))))))))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 (”.")))Brak dopasowania wyników w następującym kodzie, ponieważ celem jest „\ n”.
if (Regex_search („\ n”, Regex (”.")))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 razyTe 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.";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:
W następującym kodzie nie ma się dopasować:
if (Regex_search („Tak, ABC i def”, Regex („^abc”)))))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 $”))))W następującym kodzie nie ma się dopasować:
if (Regex_search („UVW i xyz final”, Regex („xyz $”))))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.";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.";„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)))))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";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";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";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ś!";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;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 "))))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) ")))))Wyjście to:
księgarzZauważ, ż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;Zwróć uwagę na użycie właściwości pozycji z indeksem komórki, jako argumentu. Wyjście to:
Księga-> 5Wyszukaj 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ć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ć.