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
xpressive [2008/04/16 15:29]
mprzycho
xpressive [2008/04/16 15:35]
mprzycho
Linia 4: Linia 4:
  
 {{xpressive.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