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

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>​
xpressive.1208342443.txt.gz · ostatnio zmienione: 2008/04/16 12:40 przez mprzycho