String in token zerlegen und diese prüfen



  • Halihalo!

    wie kann ich einen String in token zerlegen und feststellen ob diese richtig sind? in möglichst kurzem code? momentan prüfe ich den string mittels regex auf seine richtigekeit und zerlege ihn anschließend mit string.find() und string.substr(). das erzeugt nur sehr viel code und ist recht aufwendig. geht das kürzer?

    vielen dank im voraus!



  • Ja, du kannst gleich per regex zerlegen...



  • okay. hab da jetzt nur n problem. ich benutze dev-c++ mit greta. die match-funktion hab ich schon hingekriegt. aber wie mach ich das mit split() ??? irgendwie finde ich da keine beispiele im inet und die greta hilfe bzw. M$ gibt da auch nix zu her. wie geht das??

    hier mal mein code

    // Dies ist die match-Methode die auch funktioniert
    bool MyRegexp::Matches(std::string pat, std::string str) {
        regex::match_results results;
        regex::rpattern pattern("^("+pat+")$",regex::NOCASE|regex::SINGLELINE);
        regex::match_results::backref_type br=pattern.match(str,results);
    
        if (br.matched) return true;
        else return false;
    }
    
    // Das hier krieg ich nicht gebacken :-(
    bool MyRegexp::Split(std::string str, int limit) {
        size_t st;
        regex::split_results sresults;
        st=regex::rpattern::split(str.begin(),str.end(),sresults,limit);
    
    }
    

    thx schon mal 🙂



  • aus der GRETA doc.
    Use the split_results::strings() method to retrieve a read/write STL container of the strings representing the results of a split() operation.
    Hoffe das hilft dir weiter.



  • leider nich wirklich. das hab ich auch schon gefunden.

    wenn ich den obigen code compiliere krieg ich folgenden error:

    MyRegexp.cpp: In member function bool MyRegexp::Split(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)': MyRegexp.cpp:62: error: cannot call member functionsize_t
    regex::basic_rpattern<IterT, SyntaxT>::split(OtherT, OtherT,
    regex::basic_split_results<CharT, TraitsT, AllocT>&, int) const [with OtherT
    = __gnu_cxx::__normal_iterator<char*, std::basic_string<char,
    std::char_traits<char>, std::allocator<char> > >, CharT = rechar_t, TraitsT
    = std::char_traits<char>, AllocT = std::allocator<char>, IterT =
    __gnu_cxx::__normal_iterator<const char*, std::basic_string<char,
    std::char_traits<char>, std::allocator<char> > >, SyntaxT =

    regex::perl_syntax<rechar_t>]' without object

    wie "cannot call member function ... without object" ?
    meine parameter sind doch wohl richtig oder?

    // greta doku:
    size_t rpattern::split( 
    const_iterator ibegin,    // start of the string to match
    const_iterator iend,      // one past end of string to match
    split_results & results,
    int limit = 0 ) const;
    


  • Da ich GRETA nicht kenne kann ich nur Vermutungen anstellen ich würde
    MyRegexp::Split folgendermassen implementieren

    regex::split_results MyRegexp::Split(std::string pat, std::string str) {
        size_t st;
        regex::rpattern pattern("^("+pat+")$",regex::NOCASE|regex::SINGLELINE);
        regex::split_results sresults;
        st=pattern.split(str.begin(),str.end(),sresults);
        return sresults;
    }
    

    wie du mit regex::split_results::strings() dann auf die einzelnen strings zugreifen kannst kann ich aus der doku die mir vorliegt nicht herausfinden.
    K



  • merci!
    genau da war ich auch grad angekommen 🙂 hätte ich mir eigentlich auch gleich denken können. naja manchmal sieht man halt den wald vor lauter bäumen nich... 😉
    besten dank trotzdem!

    ich werd mir jetzt erstmal STL zu gemühte ziehn.
    achja, eine frage hätte ich noch (aber off topic):
    was soll dieses K am ende deines beitrages? ich seh das des öfteren mal im forum...



  • Keine ahnung was K noch alles bedeuten könnte.
    In meinen fall ist es nur eine Abkürzung für Kurt.
    K.


Anmelden zum Antworten