Różnice między wybraną wersją a wersją aktualną.
Next revision | Previous revision | ||
xpressive [2008/04/16 12:40] mprzycho utworzono |
xpressive [2008/04/16 15:35] (aktualna) mprzycho |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
====== boost::xpressive ====== | ====== boost::xpressive ====== | ||
- | Narazie jedynie przykładowe użycie biblioteki w wyrażeniach regularnych i (bardzo)prostym parserze składni HTML | + | 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 |
- | ===== Ogólnie na temat możliwości biblioteki ===== | ||
+ | {{xpressive.cpp|}} | ||
- | ===== Dołączane pliki nagłówkowe ===== | + | <code cpp> |
+ | /* Michał Przychodzeń G1ISI */ | ||
+ | #include <boost/xpressive/xpressive.hpp> | ||
+ | #include <iostream> | ||
+ | #include <boost/foreach.hpp> | ||
+ | using namespace std; | ||
+ | using namespace boost::xpressive; | ||
+ | using namespace boost; | ||
- | ===== Tworzenie wyrażeń regularnych za pomocą boost::xpressive ===== | + | // 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){ | ||
- | ===== Zaawansowane możliwości boost::xpressive ===== | + | 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() <<endl; | ||
+ | } | ||
+ | else{ | ||
+ | recursive_display_nested_results(beg->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("<html><head></head><body><h1></h1><p></p></body></html>"); | ||
+ | string tekst("<html><body></body></html>"); | ||
+ | |||
+ | 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 >> ">"; // <tag> | ||
+ | sregex close_tag = as_xpr("</") >> -*alnum >> ">"; // </tag> | ||
+ | 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 = "<html><head><title>Tytul</title></head><body><h1>Naglowek</h1><p1>"\ | ||
+ | "Akapit</p1><table><tr><td>naglowek</td><td>naglowek</td><td>naglowek</td></tr><tr><td>A</td><td>B</td>"\ | ||
+ | "<td>C</td></tr><tr><td>1</td><td>2</td><td>3</td></tr></table></body></html>"; | ||
+ | |||
+ | // 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; | ||
+ | } | ||
+ | </code> |