Narzędzia użytkownika

Narzędzia witryny


xpressive

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Previous revision
Next revision
Previous revision
xpressive [2008/04/16 14:58]
mprzycho
xpressive [2008/04/16 15:35]
mprzycho
Linia 3: Linia 3:
  
  
-{{boost_xpressive2.cpp|}}+{{xpressive.cpp|}} 
 + 
 +<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; 
 + 
 +// 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() <<​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>​
xpressive.txt · ostatnio zmienione: 2008/04/16 15:35 przez mprzycho