×
Dodano do koszyka:
Pozycja znajduje się w koszyku, zwiększono ilość tej pozycji:
Zakupiłeś już tę pozycję:
Książkę możesz pobrać z biblioteki w panelu użytkownika
Pozycja znajduje się w koszyku
Przejdź do koszyka

Zawartość koszyka

ODBIERZ TWÓJ BONUS :: »

C++11 Zrozumieć Wyrażenia Regularne

(ebook) (audiobook) (audiobook)
Autor:
Adam Majczak
  • Niedostępna
Wydawnictwo:
AKMAJCZAK
Ocena:
5.0/6  Opinie: 1
     ePub
 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");

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)|(\\b\\d)");.

Listing 6.84. Zastosowanie tablicy wzorców:

{"[abc]","(a|b|c)","(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"), r2("\\w*\\d+\\w*\\d+\\w*");.

Listing 12.132. Wyrażenia:

r1("\\w"), r2("\\w*\\d+\\w*\\d+\\w*"), r3("\\w*[A-Z]\\w*");

Listing 12.133. Wyrażenia: r1("\\w"), r2("\\d(?=\\d)"), r3("[A-Z]");.

Listing 12.134. Wyrażenie: r1("([0-9])-([0-9])-([0-9])");

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])(?=.*[@#_$%]).)";.

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

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

Wybrane bestsellery

Adam Majczak - pozostałe książki

AKMAJCZAK - inne książki

Zamknij

Przenieś na półkę

Proszę czekać...
ajax-loader

Zamknij

Wybierz metodę płatności