C++11: Zrozumieć Wyrażenia Regularne, wydanie II - Helion
ebook
Autor: Adam MajczakISBN: 978-13-111-5840-6
Format: ebook
Data wydania: 2015-02-03
Księgarnia: Helion
Cena książki: 33,30 zł
Published: Jan, 2015
Language: Polish
Informacje zawarte w niniejszej publikacji są udostępniane na zasadzie „As Is” bez jakichkolwiek gwarancji. Autor dołożył wszelkich starań, by informacje zawarte w niniejszej książce pozostawały poprawne, precyzyjne, aktualne i prawidłowe, Autor nie ponosi jednakże żadnego rodzaju odpowiedzialności, ani bezpośredniej, ani pośredniej, za jakiekolwiek szkody wynikłe w rezultacie wykorzystania informacji zawartych w niniejszej książce, bowiem ani nie może przewidzieć, ani nie może mieć wpływu na sposoby ich wykorzystania.
Niniejsza książka przeznaczona jest do osobistego użytku i wykorzystania przez Czytelnika i nie może być ponownie sprzedawana, ani oferowana w jakiejkolwiek innej formie osobom trzecim. Każdy Użytkownik proszony jest o uzyskanie własnej, legalnej kopii.
C. Żadna część niniejszej książki nie może być kopiowana, powielana, ani rozpowszechniana wtórnie za pośrednictwem nośników fizycznych, ani elektronicznych, bez pisemnej zgody Autora, gdyż stanowi to naruszenie Praw Autorskich. Użyte natomiast w książce wyrażenia regularne nie są zastrzeżone i mogą być stosowane w wyszukiwarkach i aplikacjach bez ograniczeń. W razie wykorzystania cytatów, by pozostać w zgodzie z Prawem i Dobrym Obyczajem, należy wskazać jednoznacznie źródło.
Adam Majczak
C++11:
Zrozumieć Wyrażenia Regularne
Druga Edycja Polska
(poprawiona i uzupełniona)
C++11: Understanding Regular Expressions
by
Adam Majczak
The Second Polish Edition
(updated and improved)
C. Adam Majczak, 2015, All Rights Reserved
The Smashwords' Polish Edition
E-Edition, License Notes
This e-book is licensed for your personal use only. This e-book may not be re-sold or given away to others. If you would like to share this book with another person, please purchase an additional copy for each recipient.
The information in this book is distributed on an “As Is” basis, without warranty. While every precaution has been taken in the preparation of this book, the publisher and the author assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein.
Adam Majczak
C++11: Zrozumieć wyrażenia regularne
Spis treści
C++11: Zrozumieć Wyrażenia Regularne, wydanie II eBook -- spis treści
Adam Majczak
C++11: Zrozumieć wyrażenia regularne
SPIS TREŚCI:
Dla kogo przeznaczona jest ta książka?
Przedmowa do pierwszego wydania
SPIS LISTINGÓW:
Część I – Specyfika składni i notacji C++11
ROZDZIAŁ 1: Wprowadzenie
Kompilatory, konsolidatory, stadia tworzenia kodu wykonywalnego
Dostępne kompilatory C++ i kompilacja online
IDE dla C++11 online
IDE dla C++14 online
Podsumowanie rozdziału
ROZDZIAŁ 2: Konstrukcja kodu źródłowego w C++11
Koncepcja przestrzeni nazw namespace
Funkcja main()
Komentarze w C++11 – bez zmian
Zmienne numeryczne w C++11 i słowo kluczowe auto
Standardowe typy zmiennych numerycznych, zakresy wartości, aliasy
Stałe, czyli konstanty
Typ porządkowy enum, inne kategorie stałych
Typ porządkowy w C++11 (enum class)
ROZDZIAŁ 3: Tablice numeryczne i łańcuchy znaków
Rozpowszechniona NIEPRAWDA: nazwa tablicy to nie to samo co wskaźnik
Obsługa łańcuchów znaków w formacie ASCIIZ
Przydatne elementy składni C,
Tablice dynamiczne po raz pierwszy
Wskaźniki
Wymiar wskaźnika
Wskaźniki do struktur i do pól struktury
Jak zastosowanie typedef pozwala uzyskać zmienny skok wskaźnika
Pusty wskaźnik donikąd, czyli nullptr w C++11
Dynamiczne tablice z zmiennej wielkości tworzone operatorem new
Makroinstrukcja assert()
Jak postępować z dynamicznymi tablicami?
ROZDZIAŁ 4: Rozszerzenia C++11, pętla for i funkcja for_each()
Identyfikacja typu w C++11: typeid()
Pętla for w C++11
Interesująca funkcja for_each()
Binarna postać danych w C++11
Zastosowanie kontenera std::array
Łańcuch typu string jako kontener
Część II: Wyrażenia regularne w C++11
ROZDZIAŁ 5: Zrozumieć wyrażenia regularne
Bardzo krótka historia wyrażeń regularnych (GREP)
Nowe podejście C++11 do obsługi wyrażeń regularnych
Rozbudowa wzorca z uwzględnieniem znaków opcjonalnych
Budowanie wyrażeń regularnych krok po kroku
Wyrażenia regularne dla danych numerycznych w różnych formatach
Liczby szesnastkowe
Znaki specjalne w wyrażeniach regularnych - metacharacters
ROZDZIAŁ 6: Funkcje regex_search() i regex_match()
Funkcja regex_match()
Specyfika notacji C++
Wykorzystanie powtarzających się znaków
Grupy i odwołania do grup
Klasy znaków są wygodne w stosowaniu
ROZDZIAŁ 7: Więcej o maszynerii z biblioteki
Różne formaty wzorców
Jak zignorować wielkość liter – flaga icase
Pozycja w łańcuchu znaków
ROZDZIAŁ 8: Iteratory
Pierwszy iterator specjalny - regex_iterator
Przydatne metody prefix() oraz suffix()
ROZDZIAŁ 9: Zastępowanie tekstów, funkcja regex_replace()
Typowe zastosowania algorytmu regex_replace()
Kolejność automatycznej numeracji grup
Trzy najistotniejsze flagi i tryby działania funkcji
ROZDZIAŁ 10: Podział tekstu na tokeny i obsługa wyjątków
Klasyczna funkcja strtok() z biblioteki
Jak, zamiast funkcji, zastosować iterator?
Jak regex_token_iterator wykorzystuje grupy?
Dopasowania częściowe (sub-match)
Jak regex_token_iterator może zastąpić funkcjonalność regex_replace()?
Tokenem może być zbitka
Jak liczą wyrażenia regularne (sprawdzanie formalnej poprawności dat)
Obsługa wyjątków
ROZDZIAŁ 11: Analizujemy kontekst
Technika „looking forward”, czyli, co jest po?
Nie szafujmy nawiasami i grupami (zaskakujące efekty uboczne)
Wykrywanie słów i badanie kontekstu
Rozmiar ma (czasem) znaczenie
ROZDZIAŁ 12: Przykłady zastosowań wyrażeń regularnych
Walidacja adresów email
Walidacja danych na wejściu
Obsługa dat, znaczników XML, nieco szczegółów technicznych
Zastosowanie iteratora i funkcji for_each()
Selekcja negatywna (odrzucamy elementy tekstu)
Nakładamy dodatkowe warunki na hasło użytkownika
Zapamiętujemy lub pomijamy grupy znaków w dopasowaniach
ZAKOŃCZENIE
Dodatek
Lista sygnatur funkcji obsługujących wyrażenia regularne w C++11.
Najprostszy pomiar czasu
Dla kogo przeznaczona jest ta książka?
Wprowadzenie standardów C++11 i C++14 spowodowało, że obsługa wyrażeń regularnych weszła w skład standardowej biblioteki C++ (C++11 Standard Library). Dostępność biblioteki STL (Standard Template Library) oraz własnej, specjalnej biblioteki do obsługi wyrażeń regularnych spowodowała, że przetwarzanie wyrażeń regularnych w C++11 i C++14 stało się prostsze. Skoro jednakże zmienił się zestaw dostępnych narzędzi (rozszerzono również zestaw słów kluczowych języka), zmienił się także styl programowania.
W porównaniu z wcześniejszymi wersjami (POSIX, PCRE, itp.) nowa biblioteka C++11 stosuje nowe, w pełni obiektowe podejście do budowy i obsługi wyrażeń regularnych (patrz także podrozdział: Bardzo krótka historia wyrażeń regularnych)Biblioteka zawiera nowe algorytmy (szablony funkcji) i nowe iteratory. Tworzenie programów wykorzystujących wyrażenia regularne stało się szybsze, wygodniejsze i prostsze, ale metodyka w C++11 jest całkowicie nowa i odmienna.
Wydaje się zatem, że niniejszy ebook może okazać się interesującą i przydatną lekturą dla wszystkich, którzy stosują, lub zamierzają stosować nowe wersje kompilatorów języka: C++11 oraz C++14, bez względu na środowisko operacyjne. Choć tworzenie oprogramowania dla środowiska operacyjnego Windows, czy Linux ma, oczywiście, swoja specyfikę, obsługa wyrażeń regularnych w C++11/C++14 nie jest zależna od systemu operacyjnego. Poznanie nowej techniki programowania z wykorzystaniem biblioteki oraz lepsze zrozumienie działania wyrażeń regularnych może okazać się przydatne dla wszystkich użytkowników C++.
Dodatkową, praktyczną, użytkową zaletą niniejszego ebooka jest wygoda i prostota użytkowania. Za pomocą zwykłego [Ctrl]+[C] i [Ctrl]+[V] można skopiować każdy z ponad 160 przykładowych programów do kompilatora C++ online i uruchomić przykład dosłownie w kilka sekund bez konieczności instalowania jakiegokolwiek oprogramowania. To po prostu działa od zaraz.
SPIS LISTINGÓW:
Listing 1.1a. ”Hello World” niby w C, ale działa w C++11.
Listing 1.1b. Strumień cout zamiast funkcji printf().
Listing 1.2. Odczytujemy parametry środowiska na zdalnym serwerze.
Listing 2.3. Namespace po raz pierwszy (kod bez std::).
Listing 2.4. Każdy programista może mieć własną przestrzeń namespace.
Listing 2.5. Klauzuli using namespace wystarczy użyć raz.
Listing 2.6. Przykład komunikatu o błędzie Visual C++.
Listing 2.6b. Zastosowanie wskaźnika do wskaźnika: char** p;
Listing 2.7. Operator sizeof() pozwala sprawdzić ile miejsca zajmuje zmienna w pamięci.
Listing 2.8. Słowo kluczoweauto(automatyczna dedukcja typu).
Listing 2.9. Domyślny typ double, rezultat dodawania.
Listing 2.10. Sprawdzamy wielkość podstawowych typów numerycznych.
Listing 2.11. Liczby ósemkowe i szesnastkowe, wymuszona konwersja typu.
Listing 2.12. Różne zastosowania typu char.
Listing 2.13. Liczby typu signed char i unsigned char.
Listing 2.14. Typ long long oraz long double w 32-bitowym środowisku operacyjnym.
Listing 2.15. Logiczna interpretacja wartości stało- i zmiennoprzecinkowych.
Listing 2.16. Kilka sposobów definiowania stałych numerycznych.
Listing 2.17. Jak zmienić dokładność (precyzję na) wydruku.
Listing 2.18. Zastosowanie metody cout.precision().
Listing 2.19. Jak uzyskać maksymalną dokładność dla typu double.
Listing 2.20. Zastosowanie numeric_limits.
Listing 2.21. Wyrażenie stałowartościowe constexpr.
Listing 2.22. Zastosowanie typu porządkowego enum.
Listing 2.23. Predefiniowane stałe matematyczne z grupy M_.
Listing 3.24a. Jak C++11 automatycznie zeruje zawartość tablicy.
Listing 3.24b. Jednowymiarowa statyczna tablica znakowa.
Listing 3.25. Uwzględnienie znaku końca łańcucha (format ASCIIZ).
Listing 3.25b. Dlaczego łańcuch znaków ”ALA” składa się z 4 znaków?
Listing 3.25c. Nazwa tablicy jako stała adresowa.
Listing 3.25d. Rozmieszczenie łańcuchów znaków w pamięci przez kompilator.
Listing 3.25e. Zastosowanie wskaźników zmniejsza obciążenie pamięci.
Listing 3.26. Obsługa łańcuchów znaków w formacie ASCIIZ.
Listing 3.27. Kopiowanie i dodawanie (konkatenacja) łańcuchów znaków jak w języku C.
Listing 3.27b. Kopiowanie i dodawanie łańcuchów znaków typu string (C++11).
Listing 3.28. Zliczanie znaków w łańcuchu przy pomocy funkcji C.
Listing 3.29. C++11: zliczanie znaków w łańcuchu typu string przy pomocy metody length().
Listing 3.30. Zmienna typu string automatycznie dostosuje swoją wielkość.
Listing 3.30a. Obsługa długich łańcuchów znaków.
Listing 3.30b. Zależne (skorelowane) pętle programowe.
Listing 3.30c. Funkcje z biblioteki rozpoznają kategorie znaków.
Listing 3.30d. Liczymy wiersze, słowa i znaki.
Listing 3.31. Wektor i metoda push_back().
Listing 3.33. Wskaźnik (raw pointer) jako adres zmiennej.
Listing 3.34. Komunikat o błędzie, nie da się pobrać adresu R-wartości.
Listing 3.35. Nieprawidłowa deklaracja wskaźnika (typowy, częsty błąd).
Listing 3.36. Prawidłowa deklaracja wskaźnika.
Listing 3.37. Przestawienie wskaźnika tak, by wskazał inna zmienna.
Listing 3.38. Przestawienie wskaźnika o 1 bajt
Listing 3.39. Przestawienie wskaźnika o 4 bajty.
Listing 3.40. Obsługa wskaźnika - funkcja printf() i strumień cout.
Listing 3.41. Wskaźnik do struktury i do pól struktury.
Listing 3.42. Rozmiar wskaźnika.
Listing 3.42a. Zmienny krok wskaźnika.
Listing 3.42b. Wykrywanie niezainicjowanych wskaźników – nullptr.
Listing 3.42c. Operator kropki i pola struktury.
Listing 3.42d. Pola struktury wskazywane przez pointer. Operator [→].
Listing 3.42e. Dynamiczna tablica tworzona w ruchu programu, operator new.
Listing 3.43. Numeryczna tablica statyczna zgodna z konwencją C.
Listing 3.44. Odwołanie do elementów tablicy przy pomocy wskaźnika.
Listing 3.45. Błędne odwołanie do nieistniejących elementów tablicy.
Listing 3.46. Błędne odwołanie do tablicy poprzez wskaźnik.
Listing 3.47. Odwołanie do elementów dynamicznej tablicy o zmiennej wielkości.
Listing 3.48.Tworzymy tablicę o zadanej wielkości w ruchu programu (operator new).
Listing 4.49. Wyznaczamy rozmiar tablicy dla pętli for w ruchu programu.
Listing 4.50. Identyfikacja typu w ruchu programu, C++11: typeid().
Listing 4.51. Identyfikacja typu danych użytkownika w ruchu programu.
Listing 4.51a. Co robi C++11, jeśli zastosujemy słowo auto?
Listing 4.51b. C++11 automatycznie dobiera odpowiedni typ wskaźnika.
Listing 4.52. Inicjujemy tablicę w nagłówku sterującym pętli for.
Listing 4.53. C++11 liczy automatycznie powtórzenia pętli for.
Listing 4.54. Automatyczna adaptacja inteligentnej pętli orogramowej.
Listing 4.54a. Magiczna sztuczka C++11: automatyczna referencja auto&.
Listing 4.55.Funkcja for_each().
Listing 4.56. Zamiana liczby na postać binarną przy pomocy funkcji.
Listing 4.57. Zamiana liczby na postać binarną przy pomocy klasy.
Listing 4.58. Konwersja na postać dwójkową z wykorzystaniem STL ().
Listing 4.59. Tablice statyczne typu array oraz array.
Listing 4.60. Dwubajtowe i czterobajtowe kodowanie znaków w C++11.
Listing 4.60a. Łańcuch typu string obsługiwany jako tablica i jako kontener.
Listing 5.61. Pierwsze wyrażenie regularne szuka w tekście łańcucha znaków ”kot”.
Listing 5.62. Dopasowanie do wzorca i funkcja regex_search().
Listing 5.63. Klasyczna składnia języka C (PCRE, kompilator GNU GCC).
Listing 5.64. Wyrażenie regularne: regex r("(kot)(ek)?");
Listing 5.65. Wyrażenie regularne: regex r("....(ko)(t)?(cisko)?(ek)?.");
Listing 5.65a. Wyrażenie [a-d]*.
Listing 5.66. Demonstracja działania wyrażeniaregex r("[b-z]+\\d{3}");
Listing 5.66. Jak realizować funkcję sumy logicznej (OR) w wyrażeniach regularnych.
Listing 5.67. Określamy długość łańcucha znakowego w dopasowaniu.
Listing 5.68. Wyrażenie regex r("[a-z]+\\s[a-z]\\s\\W\\s\\d+\\W");
Listing 5.69. Wykluczamy znaki niepożądane.
Listing 5.70. Wyrażenie ”((...4)|(.9..)|(..8.)).+)”.
Listing 5.70b. Porównanie działania znaków [?] oraz [*].
Listing 5.71. Wyrażenie my_regex = ”^-?\d+(\\.\\d+)?((e|E)-?\\d+)?$”;
Listing 5.71. Kod PHP wychwytujący liczby szesnastkowe:
$my_regex = '/(0x)?#?[A-Fa-f0-9]+/';
Listing 5.72. Działanie wyrażenia my_regex = “^(0x)?#?([A-Fa-f0-9]\\s?)+$”;
Listing 5.73. Działanie znaków [^] oraz [$].
Listing 5.73b. Działanie znaków [\\b].
Listing 5.74. Działanie wyrażeń regex r1("l+o\\b"), r2("\\s.+o.+[^!]");
Listing 6.75. Działanie wyrażenia reg1("[[:digit:]]+");
Listing 6.76. Porównanie działania funkcji regex_search() oraz regex_mach().
Listing 6.77. Działanie wyrażenia ”(\\+|-)?[[:digit:]]+(\\.)?[[:digit:]]*”.
Listing 6.78. Działanie wyrażenia regex r("\\++");.
Listing 6.79. Działanie wyrażenia wzorzec = "\\\\";,
Listing 6.79b. Wyrażenie: regex r("\.{1}[+\*/.-]+");
Listing 6.80. Znaki Unicode, wyrażenie: wzorzec = "\\u0050";.
Listing 6.81. Działanie wyrażenia: "\\b(k|s)[a-zA-Z]*t\\b".
Listing 6.81b. Zastosowanie wyrażenia: wzorzec = "(a|b|c)\\1";.
Listing 6.82. Podwójne wsteczne odwołanie do grupy (backreference):
wzorzec = "([a-c])X\\1Y\\1";.
Listing 6.83. Zastosowanie wyrażenia: r("(A\\d{2})|(\\b\\d{3})");.
Listing 6.84. Zastosowanie tablicy wzorców:
{"[abc]{2}","(a|b|c){2}","(a|b|c)\\1"};.
Listing 6.85. Wykrywanie powtarzających się słów: wzorzec = "([a-zA-Z]+)\\s\\1";
Listing 6.86. Działanie wyrażenia: wzorzec = "\\b(\\w)?(\\w)\\w?\\2\\1";.
Listing 6.87. Wyrażenie: r("^((0x)|#)?([[:xdigit:]]\\s?)+$");
Listing 7.88. Działanie wyrażenia: "\\b(\\w)?(\\w)\\w?\\2\\1";
Listing 7.89. Działanie wyrażenia: ”([A-Za-z]+) \\1” == "(\\w+)\\s\\1";.
Listing 7.90. Działanie wyrażenia: wzorzec = "(\\w+)\\s?\\1";.
Listing 7.91. Wystarczy, jeśli funkcja regex_search() znajdzie pierwsze dopasowanie.
Listing 7.92. Określamy pozycję w przeszukiwanym łańcuchu znaków. Obiekt smatch.
Listing 7.93. Określamy pozycję w przeszukiwanym łańcuchu znaków ASCIIZ.
Listing 7.94. Działanie wyrażenia: wzorzec = "\\b(\\w)?(\\w)(\\w)?\\2\\1";.
Listing 8.95. Działanie iteratora (dwa iteratory).
Listing 8.95b. Działanie iteratora (pojedynczy iterator).
Listing 8.95c. Przy pomocy iteratora wyodrębniamy słowa i zbitki (liczba + słowo).
Listing 8.96. Działanie iteratora i wyrażenia: "\\b(\\w)?(\\w)\\w?\\2\\1";.
Listing 8.97. Działanie iteratora i wyrażenia: R ("\\b([a|A]l)([^ ]*)");
Listing 8.98. Zastosowanie metody suffix().
Listing 8.98b. Zastosowanie funkcji for_each().
Listing 8.98c. Niezamierzone pominięcie pierwszego dopasowania.
Listing 9.99. Zastępowanie – funkcjaregex_replace().
Listing 9.99b. Zastępowanie tylko pierwszego dopasowania (reszta bez zmian).
Listing 9.100. Działanie wyrażenia: string replace = "$1";.
Listing 9.101. Działanie wyrażeń:
wzorzec = "(\\w+)\\s[i]\\s(\\w+)"; replace = "$2 i $1";.
Listing 9.102. Zastępowanie wybranych znaków w słowach, wyrażenie: "a|e|i|o|u|y".
Listing 9.103. Wyszukiwanie i zastępowanie przy pomocy wzorców: [B+], [$`], [$'].
Listing 9.103b. Numeracja grup.
Listing 9.103c. Grupy.
Listing 9.103d . Działanie wyrażenia regex r("
(.+)
(.+)
");.Listing 10.104. Podział na tokeny, funkcja strtok().
Listing 10.105. Zastosowanie regex_token_iterator z separatorem "[-\\s,\\.]+";.
Listing 10.106. Podział na słowa przy pomocy iteratora.
Listing 10.107. Zastosowanie wzorca: wzorzec = "\\b(pod)([^\\s]*)";
Listing 10.108. Wykorzystujemy podział na grupy: \\1: (pod) oraz \\2: ([^\\s]*)
Listing 10.109. Dopasowania częściowe.
Listing 10.110. Wychwytywanie separatorów (split).
Listing 10.111. Podział na tokeny przy pomocy funkcjiregex_search().
Listing 10.112. Zastosowanie wzorca:"(\\w+)?(\\.)?(\\w+)".
Listing 10.112b. Iterator zastępuje regex_replace().
Listing 10.112c. Wykorzystanie iteratora do zliczania zbitek słownych – R("\\d+\\s[a-zA-Z]+").
Listing 10.112d. Poprawne wyrażenie i błędny wydruk: regex r("\\d{4}/(0?[1-9]|1[0-2])/(0?[1-9]|[1-2][0-9]|3[0-1])");
Listing 10.112e . Po zamianie funkcji to samo wyrażenie działa poprawnie.
Listing 10.112f . Uwaga na numerację grup w iteratorze.
Listing 10.112g. Niestety, regex_token_iterator działa tak, jak algorytm regex_search().
Listing 10.113. Typowa obsługa wyjątków w C++11.
Listing 10.114. Schemat obsługi wyjątków dla wyrażeń regularnych C++11.
Listing 10.115. Obsługa wyjątków w działaniu.
Listing 10.116. Reakcja Visual C++ na błąd formalny w wyrażeniu regularnym.
Listing 11.117. Działanie wyrażenia:"\\d+[,\\.]?(\\d)*((?=\\sdol)|(?=\\seur))".
Listing 11.118. Działanie wyrażenia: R ("(\\w+)[,]\\s");.
Listing 11.119. Działanie wyrażenia: R ("(\\w+)[,]\\s\\1");.
Listing 11.120. Działanie wyrażenia: R ("(\\b\\w+)(?=\\s(\\w+\\s)+\\1)");.
Listing 11.121. Zastosowanie metody swap().
Listing 11.122. Zastosowanie metody compare().
Listing 11.123. Zastosowanie wyrażenia w = "^(?!.*vat).*";.
Listing 11.124. Działanie wyrażenia:
w = "^([^V]|V[^A]|VA[^T])*$"; (odpowiednik: ”^(?:[^V]|f(?!AT))*$”).
Listing 11.125. Zastosowanie metody size() do zliczania znaków.
Listing 11.126. Zastosowanie metody size() do automatyzacji pętli programowej.
Listing 11.127. Metoda empty() oraz wyrażenia: R( "([abc]*)[1234]" );.
Listing 12.128. Walidacja adresów email:
R( "(\\w+)(.*)(\\w*)@(\\w+)(\\.(\\w+))+", icase );
alternatywnie:
r = "\\b([A-Z0-9\\._%+-]+)(.*)(\\w*)@(\\w+)(\\.(\\w+))+$";
Listing 12.129. Jednoczesne wykorzystanie obiektów typu cmatch oraz smatch.
Wyrażenie: R ("(sub)(.*)");
Listing 12.130. Walidacja na wejściu: R("(\\+|-)?\\d+");
Listing 12.131. Wyrażenia:r1("\\w{10,15}"), r2("\\w*\\d+\\w*\\d+\\w*");.
Listing 12.132. Wyrażenia:
r1("\\w{10,15}"), r2("\\w*\\d+\\w*\\d+\\w*"), r3("\\w*[A-Z]\\w*");
Listing 12.133. Wyrażenia: r1("\\w{10,15}"), r2("\\d(?=\\d)"), r3("[A-Z]");.
Listing 12.134. Wyrażenie: r1("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})");
Listing 12.135. Wyrażenie: "<(.*)>(.*)".
Listing 12.136. Wyrażenie: "<(.+)>(.*)" (XML).
Listing 12.137. Wyrażenia: "(\\w+)\\s[i]\\s(\\w+)"; oraz "$2 oraz $1; ";.
Listing 12.137. Wyrażenie:"<(.+)>(.*)" (HTML).
Listing 12.138. Wyrażenie: "<.+>[\n]?<(.+)>(.*)" (HTML).
Listing 12.139. Usuwanie niepożądanych znaków: "\\b[[:alpha:]]+\\d\\,?" .
Listing 12.139b. Filtrowanie hipertekstu.
Listing 12.140. Wyrażenie:
"((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#_$%]).{6,20})";.
Listing 12.141. Przy formatowaniu metodą format() stosujemy takie same wzorce, jak przy zamianie regex_replace().
Listing 12.142. Zliczanie słów i znaków. Wyrażenia: <.+>, (\\S+), (\\w{7,}).
Listing 12.143. Dopasowania grup smatch M[n](sub-match).
Listing 12.144. Działanie wyrażeniaR("(T.*)\\s(?:T.*)\\s(H.*)\\s(?:W.*)");.