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