====== boost::xpressive ====== Narazie jedynie przykładowe użycie biblioteki w wyrażeniach regularnych i (bardzo)prostym parserze składni HTML nie uwzględniającym niektórych rzeczy, a obrazującym możliwości wykorzystania biblioteki boost::xpressive {{xpressive.cpp|}} /* Michał Przychodzeń G1ISI */ #include #include #include using namespace std; using namespace boost::xpressive; using namespace boost; // pomocniczna funkcja zwracająca wcięcie na podanym poziomie wywołania string recursive_depth_space(int recursive_depth){ string tabs; for(int i =0; i < recursive_depth; i++) tabs += " "; return tabs; } // rekursywne wyświetlenie dopasowań void recursive_display_nested_results ( boost::xpressive::smatch::nested_results_type::const_iterator begin, boost::xpressive::smatch::nested_results_type::const_iterator end, int recurisive_depth){ boost::xpressive::smatch::nested_results_type::const_iterator beg = begin; for(; beg != end; beg++){ if(beg->nested_results().size()==0){ cout << recursive_depth_space(recurisive_depth) << beg->str() <nested_results().begin(), beg->nested_results().end(), recurisive_depth + 1); } } } int main(){ cout << "autor: Michal Przychodzen." << endl; cout << "Prezentacja mozliwosci biblioteki boost::xpressive" << endl; cout << "==================================================" << endl; cout << endl; cout << "wyrazenia regularne" << endl; cout << "==================================================" << endl; cout << " - sprawdzanie recursive_display_nested_results do wzorca" << endl; cout << " - wyszukiwanie wzorca" << endl; cout << " - wyszukiwanie wszystkich wystapien wzorca" << endl; cout << "==================================================" << endl; cout << endl; /* Utworzenie statycznego wyrażenia (dla obiektu string) */ /* Wyrażenie tworzone jako string i kompilowane */ string wyrazenie_str("<.*?>"); /* kompilowane wyrażenie jak w perlu */ sregex wyrazenie = sregex::compile(wyrazenie_str); smatch dopasowanie; // string tekst("

"); string tekst(""); cout << "Bazowy tekst: " << endl << tekst << endl; /* Sprawdzenie czy podany string można dopasować do wyrażenia */ /* za pomocą pełnego recursive_display_nested_results */ cout << "1a. regex_match <.*?>: " << (regex_match(tekst, dopasowanie, wyrazenie) ? "Dopasowany: "+dopasowanie.str() : "Niedopasowany") << endl; /* również sub_stringi */ cout << "1b. regex_search <.*?>: " << (regex_search(tekst, dopasowanie, wyrazenie) ? "Dopasowany: "+dopasowanie.str() : "Niedopasowany") << endl; /* wyrażenie perlowe .tm w składni c++ : */ wyrazenie = _ >> as_xpr('t') >> as_xpr('m'); /* Sprawdzenie czy podany string można dopasować do wyrażenia */ cout << "2a. regex_match .tm: " << (regex_match(tekst, dopasowanie, wyrazenie) ? "Dopasowany: "+dopasowanie.str() : "Niedopasowany") << endl; cout << "2b. regex_search .tm: " << (regex_search(tekst, dopasowanie, wyrazenie) ? "Dopasowany: "+dopasowanie.str() : "Niedopasowany") << endl; /* wyrażenie perlowe <.*> w składni c++ */ wyrazenie = "<" >> *_ >> ">"; /* Sprawdzenie czy podany string można dopasować do wyrażenia */ cout << "3a. regex_match <.*>: " << (regex_match(tekst, dopasowanie, wyrazenie) ? "Dopasowany: "+dopasowanie.str() : "Niedopasowany") << endl; cout << "3b. regex_search <.*>: " << (regex_search(tekst, dopasowanie, wyrazenie) ? "Dopasowany: "+dopasowanie.str() : "Niedopasowany") << endl; /* wyrażenie perlowe <.*> w składni c++ */ wyrazenie = "<" >> *_ >> ">"; cout << "4a. regex_iterator <.*>: Znalezione: " << endl; /* Wszystkie dopasowane sub_stringi */ sregex_iterator current(tekst.begin(), tekst.end(), wyrazenie); sregex_iterator end; for(;current != end; current++){ cout << current->str()<< endl; } /* wyrażenie perlowe <.*?> w składni c++ */ wyrazenie = "<" >> (s1 = -*_) >> ">"; cout << "4b. regex_iterator <.*?>: Znalezione: " << endl; /* Wszystkie dopasowane sub_stringi */ current = sregex_iterator(tekst.begin(), tekst.end(), wyrazenie); for(;current != end; current++){ cout << current->str()<< endl; } cout << endl; cout << "5. Rozszerzone mozliwosci boost::xpressive ktorych nie maja wyrazenia regularne" << endl; cout << "==================================================" << endl; cout << endl; /* Definiujemy uproszczoną budowę dokumentu HTML */ sregex open_tag = "<" >> -*alnum >> ">"; // sregex close_tag = as_xpr("> -*alnum >> ">"; // sregex intext = *(_w); // insidetag sregex tag = open_tag >> ( !intext | *by_ref(tag) ) >> close_tag; sregex document = tag; smatch what; /* tekst poddawany testowi na poprawność składni */ tekst = "Tytul

Naglowek

"\ "Akapit"\ "
nagloweknagloweknaglowek
ABC
123
"; // X - odznaczyć w celu wpisywania tekstu do testowania // X while(tekst.length() > 1){ if(regex_match(tekst, what, document)){ cout << "Dopasowano dokument HTML:" << endl << tekst << endl << endl; /* ładne wyświetlenie sformatowanego dokumentu html */ recursive_display_nested_results(what.nested_results().begin(), what.nested_results().end(), 0); } // X cin>>tekst; // X } getchar(); return 0; }