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\"> <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 ;)).