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

Linux c++ boost regex instalacja

Jeśli chcemy wyszukiwać wyrażenia regularne tzw. regex w c++ musimy użyć biblioteki boost. Trzeba ją najpierw zainstalować.

$apt-get install libboost-iostreams1.50.0  

jest to oczywiście starsza wersja, nowa wymaga kompilacji

nasŧępnie instalacja dodatku regex:

$apt-get install libboost-regex1.50.0  

oczywiście pakiety które chcą się zainstalować przy okazji będą potrzebne do prawidłowego działania

no i na koniec musimy przy kompilacji dodać na końcu parametr : -lboost_regex

czyli na przykład kompilacja może wyglądać tak:

$g++ -Wall -std=c++11 -lboost_regex-mt -o regex_poczatek regex_poczatek.cpp -lboost_regex

tak to wygląda mniej więcej w debianie i ubuntu i działa w środowisku geany