C++11 Zrozumieć Wyrażenia Regularne - Helion
ISBN: 978-13-107-5633-7
Format: ebook
Data wydania: 2014-12-18
Księgarnia: Helion
Cena książki: 25,53 zł
Bibliteka <regex> weszła w skład Standardowej Biblioteki C++ (The C++11 Standard Library), dlatego C++11 i C++14 obsługują wyrażenia regularne wykorzystując szablony (template). W skład bibliteki <regex> wchodzą algorytmy regex_search(), regex_match() oraz regex_replace, i dwa nowe iteratory: regex_iterator oraz regex_token_iterator. Działanie tych algorytmów i iteratorów został opisane w książce i przedstawione na ponad 140 przykładach. Ksiązka omawia równiez zaawansowane techniki oparte o referencje (looking forward). Dla porównania, ksiązka zawiera takze przykładowe kody C (PCRE) i PHP.
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.7. Operator sizeof() pozwala sprawdzić ile miejsca zajmuje zmienna w pamięci.
Listing 2.8. Słowo kluczowe auto (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.24. Jednowymiarowa statyczna tablica znakowa.
Listing 3.25. Uwzględnienie znaku końca łańcucha (format ASCIIZ).
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.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.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.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.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 (<bitset>).
Listing 4.59. Tablice statyczne typu array<int, n> oraz array<string, k>.
Listing 4.60. Dwubajtowe i czterobajtowe kodowanie znaków w C++11.
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.66. Demonstracja działania wyrażenia regex 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.lanie 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 dzialania 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.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 powtarzajacych 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 przeszulkiwanym łańcuchu znaków. Obiekt smatch.
Listing 7.93. Określamy pozycję w przeszulkiwanym ł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.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 9.99. Zastępowanie – funkcja regex_replace().
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 10.104. Podziuał 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 funkcji regerx_search().
Listing 10.112. Zastosowanie wzorca: "(\\w+)?(\\.)?(\\w+)".
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: "<(.*)>(.*)</(\\1)>".
Listing 12.136. Wyrażenie: "<(.+)>(.*)</(\\1)>" (XML).
Listing 12.137. Wyrażenia: "(\\w+)\\s[i]\\s(\\w+)"; oraz "$2 oraz $1; ";.
Listing 12.137. Wyrażenie:"<(.+)>(.*)</(\\1)>" (HTML).
Listing 12.138. Wyrażenie: "<.+>[\n]?<(.+)>(.*)</(\\1)>" (HTML).
Listing 12.139. Usuwanie niepożądanych znaków: "\\b[[:alpha:]]+\\d\\,?" .
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).
Spis treści
C++11 Zrozumieć Wyrażenia Regularne eBook -- spis treści
SPIS TREŚCI:
Przedmowa do pierwszego wydania
SPIS LISTINGÓW:
Część I – Wyjaśnienie specyfiki składni i zapisu C++11
ROZDZIAŁ 1: Wprowadzenie
Kompilatory, konsolidatory, stadia tworzenia kodu wykonywalnego
Dostępne kompilatory C++ i kompilacja online
IDE dla C++11 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
ROZDZIAŁ 3: Tablice numeryczne i łańcuchy znaków
Obsługa łańcuchów znaków w formacie ASCIIZ
Tablice dynamiczne
Wskaźniki
Skalarny wymiar wskaźnika
Wskaźniki do struktur i do pól struktury
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
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 <regex>
Różne formaty wzorców
Jak zignorować wielkość liter – flaga icase
Pozycja w łańcuchu znaków
ROZDZIAŁ 8: Iteratory
Przydatne metody prefix() oraz suffix()
ROZDZIAŁ 9: Zastępowanie tekstów, funkcja regex_replace()
Kolejność automatycznej numeracji grup
ROZDZIAŁ 10: Podział tekstu na tokeny i obsługa wyjątków
Klasyczna funkcja strtok() z biblioteki <string.h>
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()?
Obsługa wyjątków
ROZDZIAŁ 11: Analizujemy kontekst
Technika „looking forward”, czyli, co jest po?
Nie szafujmy nawiasami i grupami (zaskakujące efekty)
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
Przedmowa do pierwszego wydania
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 <regex> spowodowała, że przetwarzanie wyrażeń regularnych w C++11 i C++14 stało się wygodniejsze i prostsze. Skoro jednakże zmienił się zestaw dostępnych narzędzi (rozszerzona również zestaw słów kluczowych języka), zmienił się także styl programowania.
Niniejsza książka zawiera ponad 140 listingów przykładowych programów i składa się z 2 części:
Część I – Wyjaśnienie specyfiki składni i zapisu C++11
Część II – Wyrażenia regularne w C++11
Część pierwsza ma charakter wprowadzenia. Takie wprowadzenie wydaje się celowe, by ułatwić Czytelnikowi szybkie i dokładne zrozumienie przykładów zawartych w Części 2. Prawie pod wszystkimi przykładami dodano robocze wydruki, samodzielne uruchomienie przykładów (wszystkie można skompilować i uruchomić online) pozwoli jednakże Czytelnikom na wykonanie samodzielnych prób i eksperymentów.
Poniżej umieszczono listę listingów z przykładowymi kodami C++11 ilustrujących kolejne omówione zagadnienia. Numer listingu zawiera numer Rozdziału oraz numer kolejny, co powinno ułatwić korzystanie z przykładów. Wszystkie listingi zawierają pełne, działające, gotowe do uruchomienia kody C++.
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.7. Operator sizeof() pozwala sprawdzić ile miejsca zajmuje zmienna w pamięci.
Listing 2.8. Słowo kluczowe auto (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.24. Jednowymiarowa statyczna tablica znakowa.
Listing 3.25. Uwzględnienie znaku końca łańcucha (format ASCIIZ).
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.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.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.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.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 (<bitset>).
Listing 4.59. Tablice statyczne typu array<int, n> oraz array<string, k>.
Listing 4.60. Dwubajtowe i czterobajtowe kodowanie znaków w C++11.
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.66. Demonstracja działania wyrażenia regex 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.lanie 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 dzialania 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.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 powtarzajacych 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 przeszulkiwanym łańcuchu znaków. Obiekt smatch.
Listing 7.93. Określamy pozycję w przeszulkiwanym ł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.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 9.99. Zastępowanie – funkcja regex_replace().
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 10.104. Podziuał 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 funkcji regerx_search().
Listing 10.112. Zastosowanie wzorca: "(\\w+)?(\\.)?(\\w+)".
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: "<(.*)>(.*)</(\\1)>".
Listing 12.136. Wyrażenie: "<(.+)>(.*)</(\\1)>" (XML).
Listing 12.137. Wyrażenia: "(\\w+)\\s[i]\\s(\\w+)"; oraz "$2 oraz $1; ";.
Listing 12.137. Wyrażenie:"<(.+)>(.*)</(\\1)>" (HTML).
Listing 12.138. Wyrażenie: "<.+>[\n]?<(.+)>(.*)</(\\1)>" (HTML).
Listing 12.139. Usuwanie niepożądanych znaków: "\\b[[:alpha:]]+\\d\\,?" .
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żenia R("(T.*)\\s(?:T.*)\\s(H.*)\\s(?:W.*)");.