reklama - zainteresowany?

C++11 Zrozumieć Wyrażenia Regularne - Helion

C++11 Zrozumieć Wyrażenia Regularne
ebook
Autor: Adam Majczak
ISBN: 978-13-107-5633-7
Format: ebook
Data wydania: 2014-12-18
Księgarnia: Helion

Cena książki: 25,53 zł

Dodaj do koszyka C++11 Zrozumieć Wyrażenia Regularne

Tagi: C++ - Programowanie

 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).

Listing 12.144. Działanie wyrażenia R("(T.*)\\s(?:T.*)\\s(H.*)\\s(?:W.*)");.

Dodaj do koszyka C++11 Zrozumieć Wyrażenia Regularne

Dodaj do koszyka C++11 Zrozumieć Wyrażenia Regularne

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.*)");.

 

Dodaj do koszyka C++11 Zrozumieć Wyrażenia Regularne

Code, Publish & WebDesing by CATALIST.com.pl



(c) 2005-2024 CATALIST agencja interaktywna, znaki firmowe należą do wydawnictwa Helion S.A.