C++ biblioteka Boost – regex

Boost – regex w c++

Biblioteka BOOST to kolekcja bibliotek programistycznych poszerzających możliwości języka C++, objętych liberalną licencją, która umożliwia użycie ich w dowolnym projekcie.
Oferuje multiplatformowość(obsługuje mac,linux,windows) jednakże trzeba ją najpierw zainstalować.
Ceną za jakość bibliotek jest konieczność stosowania nowoczesnego kompilatora, w jak najpełniejszym zakresie zgodnego ze standardem języka, a także dość długi czas kompilacji programów.
Biblioteka boost ze wszystkimi możliwościami waży około 1,5GB, A wersja do podstawowych zastosowań do kompilacji – 64MB.
Jedną zasadniczą funkcją którą opiszę jest wyszukiwanie regex’ów czyli wyrażeń regularnych występujących w tekście co poszerza znacznie możliwości naszych programów. Sprawa regex jest dosyć trudna do implementacji samemu ponieważ ciężko o dobry alorytm wyszukiwania zawiłych zdań, zwrotów. W podstawowych bibliotekach c++ nie ma możliwości wyszukania regex’ów więc opiszę to z wykorzystaniem biblioteki boost.

Strona projektu boost: http://www.boost.org/

Kompilacja

Całość kompilowałem pod linuxem w środowisku geany. Może się zdarzyć że program się nie kompiluje ponieważ jest nie zainstalowana biblioteka boost lub w kompilatorze brak opcji -lboost_regex.

Znaki specjalne

są to znaki których możemy użyć by sformułować wzorzec dotyczący czego wyszukujemy.

\\w    wyszukiwanie liter

.    dowolny pojedyńczy znak

[[:klasa:]]    klasa znakowa

{n}    licznik

(wyr)    grupa

\znak    następny znak ma specjalne znaczenie

wyr*    0 lub więcej znaków po wyrazie

wyr+    1 lub więcej znaków po wyrazie

wyr?    opcjonalność(0 lub 1) znaków po wyrazie

wyr|wyr    lub (alternatywa) czyli: wyraz1 lub wyraz2

^wyr    negacja

$    koniec wiersza

(wyr = wyrażenie)

prosty przykład: „(.+) | (ads){2}” Wzorec ten oznacza „zero lub więcej znaków, albo ciąg ‚adsads’ „

Rodzaje znaków

\d    cyfra dziesiętna

\l    mała litera

\s    biały znak(spacja, tabulator itd.)

\u    wielka litera

\w    litera, cyfra lub „_”

\D    nie \d czyli rozróżnianie wielkich i małych liter

Przykład

np. „\l\l\d” czyli „dwie małe litery, po których następuje cyfra dziesiętna”

Powtórzenia

{n}    dokładnie n razy

{n,}    n lub więcej razy

{n,m}    przynajmniej n i najwyżej m razy

*    to samo co {0,}

+    to samo co {1,}

?    to samo co {0,1}

Przykład

np. „0x*”, co znaczy „cyfra ‚0’, po której następuje jedna lub więcej liter ‚x’ ”

Program który obrazuje wykorzystanie (w załączniku jako plik1.cpp oraz skompilowany plik1.sh):

#include <iostream>

#include <boost/regex.hpp> // jeśli nie mamy kompilatora zgodnego z standardem C++0x, musimy sami zainstalować bibliotekę boost

using namespace boost; //narzędzia biblioteki boost znajdują się w przestrzeni nazw boost, definiujemy by mieć mniej pisania

using namespace std;

int main(){

cout<<„Program regex”<<endl<<„——–„<<endl;

string tekst;//deklarujemy zmienną typu sting

tekst=”Nasz ukochany blip wyraz tekst bla to bla wielki to wybryk wyobcowanego programisty”;

cout<<„nasz ciag”<<endl<<tekst<<endl<<„———-„<<endl;//wyświetli wartość zmiennej tekst

regex wzorzec( „\\w* to \\w*” );//czyli reguła którą będziemy wyszukiwać

smatch wynik;//Tworzymy zmienną typu smatch, która będzie przechowywała wyniki.

// zasada użycia funkcji regex – regex_search(tekst_w_ktorym_wyszukujemy, zmienna_do_wyswietlenia_wyniku, regula_jakiej_wyszukujemy)

if( regex_search(tekst,wynik,wzorzec) ) //if służy do tego by sprawdzić czy coś znaleziono, bo jak nie to po co wyświetlać?

{

cout << „co znalazl: ” << wynik[0] << endl; //używamy wynik[0] ponieważ odnosi się do całego wyszukiwanego wyrażenia, jeśli damy wynik[1] wyszuka nam pierwszą część wyrażenia – dotyczy to dzielenia na podzbiory wyrarzeń

}

return 0;

};

W przypadku w którym chcemy wyszukać adres email(plik2.cpp i plik2.sh):

#include <iostream>

#include <string>

#include <boost/regex.hpp> // jeśli nie mamy kompilatora zgodnego z standardem C++0x, musimy sami zainstalować bibliotekę boost

using namespace boost; //narzędzia biblioteki boost znajdują się w przestrzeni nazw boost, definiujemy by mieć mniej pisania

using namespace std;

int main(){

cout<<„Program regex znajdujemy maila”<<endl<<„——–„<<endl;

string tekst; //deklarujemy zmienną typu sting

tekst=”W moim Tekscie teraz tusk@donald.com jest wiele john@deer.pl adresow email kropka@dot.org”;

cout<<„nasz ciag”<<endl<<tekst<<endl<<„———-„<<endl; //wyświetli wartość zmiennej tekst

regex wzorzec( „\\w*[@]\\w*[.]\\w*” ); //czyli reguła którą będziemy wyszukiwać [@] to pojedyńczy znak specjalny

smatch wynik;//Tworzymy zmienną typu smatch, która będzie przechowywała wyniki.

// zasada użycia funkcji regex – regex_search(tekst_w_ktorym_wyszukujemy, zmienna_do_wyswietlenia_wyniku, regula_jakiej_wyszukujemy)

if( regex_search(tekst,wynik,wzorzec) ) //if służy do tego by sprawdzić czy coś znaleziono, bo jak nie to po co wyświetlać?

{

cout << „co znalazl: ” << wynik[0] << endl;

}

return 0;

};

pliki dostępne  pod adresem: http://chomikuj.pl/tomek99007/boost+c*2b*2b

Autor

Tomasz

Pasjonat Elektroniki Linuxa i open source

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s