Boost::Regex Frage



  • hi,
    ich weiss nicht ob ich hier richtig bin...
    ich hab einen kleinen regex ausdruck definiert...
    warum funzt folgender ausdruck für den string test in der main nicht:

    boost::regex rxSenderEmail
    (
    	"(aRecip\" title=\")"  // intro
    	"( ([az]|[AZ]|[09]|\\@|\\.)* )" // alles dazwischen + weitere
    	"(\")"                 // outtro
    );
    

    was ist der unterschied zw. resMatch[ 0 ]; und resMatch[ 5 ]; bzw. *(resMatch[ 0 ].second) ...ist in der boost doku nicht verständlich;/

    so gehts:

    bool check_SenderEmail(const string strBuffer)
    {
    	boost::regex rxSenderEmail
    	(
    		"aRecip\" title=\""       // intro
    		"("
    		"\\d|\\l|\\u|"          // digits, lowers, uppers
    		"[\\?\\./=@%&_-]"       // extra chars in an email addy
    		")*"
    		"\""                      // must end with inverted commas
    	);
    
    	typedef std::string::const_iterator str_cit;
    
    	str_cit sciStart = strBuffer.begin();           // 1st offset of file or buffer
            str_cit sciEnd = strBuffer.end();             // last offset of file or buffer
    
            boost::match_results< str_cit > resMatch;
    	boost::match_flag_type flgMatch = boost::match_default;
    
    	string strMatch;
    
    	if(regex_search(sciStart, sciEnd, resMatch, rxSenderEmail, flgMatch)) {
    		strMatch = resMatch[ 0 ];
    		strMatch.erase(0, 15);
    		strMatch.erase(strMatch.length() - 1, 1);
    		cout << strMatch.c_str() << endl;
    		return true;
    	}
    
    	else return false;           // no match found
    }
    
    int main()
    {
    	string test("<TD valign=\"middle\" align=\"left\"><FONT color=\"#000000\" size=\"2\">&nbsp;<A href=\"./?cmd=editrecipient&Index=-1\" class=\"aRecip\" title=\"Max.Mustermann@klu.ac.at\"><FONT SIZE='2' COLOR=black>Max Mustermann</FONT></A></FONT></TD>");
    	cout << check_SenderEmail(test) << endl;
            cin.get();
            return 0;
    }
    

    wie kann ich dem gematchen string bekommen ohne mit string::clear zu arbeiten? will also den string zwischen intro und outtro bekommen...



  • cpp1 schrieb:

    hi,
    ich weiss nicht ob ich hier richtig bin...
    ich hab einen kleinen regex ausdruck definiert...
    warum funzt folgender ausdruck für den string test in der main nicht:

    boost::regex rxSenderEmail
    (
    	"(aRecip\" title=\")"  // intro
    	"( ([az]|[AZ]|[09]|\\@|\\.)* )" // alles dazwischen + weitere
    	"(\")"                 // outtro
    );
    

    Gegenfrage: Was funktioniert daran nicht? Compilerfehler? Laufzeitprobleme? Wörter nicht erkannt? ...?

    was ist der unterschied zw. resMatch[ 0 ]; und resMatch[ 5 ]; bzw. *(resMatch[ 0 ].second) ...ist in der boost doku nicht verständlich;/

    *schaut sich die Doku an*

    match_results<>::operator[] liefert den i-ten Teiltreffer zurück (0 ist der Gesamtausdruck, alles andere sind die in Klammern eingeschlossenen Teilausdrücke - bei deinem obigen Beispiel dürfte also "resMatch[1]" den Intro-Anteil des erkannten Textes liefern. sub_match<> stammt von std::pair<> ab und packt in first/second den Anfang und das Ende der Sequenz und in matched eine Kennung, ob sie gültig ist.



  • boost::regex rxSenderEmail
    (
        "(aRecip\" title=\")"  // intro
        "( ([az]|[AZ]|[09]|\\@|\\.)* )" // alles dazwischen + weitere
        "(\")"                 // outtro
    );
    

    dieser regex hier findet kein wort: "aRecip\" title=\"Max.Mustermann@klu.ac.at\"" ich weiss aber auch nicht was daran falsch ist!?

    mit dem funktionierenden regex:
    nur resMatch[ 0 ] liefert einen output...



  • Blind geraten - versuch's mal mit "[a-z]" etc. anstelle der [az] (oder jag testweise das Wort "aRecip\" title=\"a1.z@aa.zz\"" durch deinen Ausdruck ;)).


Anmelden zum Antworten