سؤال

لقد كنت أبحث عن دفعة :: Tokenizer، ووجدت أن الوثائق رقيقة جدا. هل من الممكن جعله يقوم بتملك سلسلة مثل "Dolphin - Monkey - Baboon" وجعل كل كلمة رمزية، وكذلك كل داش مزدوج رمزية؟ من الأمثلة التي رأيتها فقط محددات حرف واحد مسموح بها. هي المكتبة غير متقدمة بما فيه الكفاية لمحددات أكثر تعقيدا؟

هل كانت مفيدة؟

المحلول

يبدو أنك سوف تحتاج إلى كتابة الخاصة بك tokenizerfunction. للقيام بما تريد.

نصائح أخرى

يتيح لك استخدام ITER_SPLIT استخدام رموز شخصية متعددة. سينتج الرمز أدناه ما يلي:

دولفين
قرد
بابون

#include <iostream>
#include <boost/foreach.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/iter_find.hpp>

    // code starts here
    std::string s = "dolphin--mon-key--baboon";
    std::list<std::string> stringList;
    boost::iter_split(stringList, s, boost::first_finder("--"));

    BOOST_FOREACH(std::string token, stringList)
    {    
        std::cout << token << '\n';  ;
    }

أعرف أن الموضوع قديم جدا، لكنه يظهر في الأعلى الروابط في Google عندما أبحث عن "مزامنة Tokenizer عن طريق السلسلة"

لذلك سأضيف البديل الخاص بي من TokenizerFunction، فقط في حالة:

class FindStrTFunc
{
public:
    FindStrTFunc() : m_str(g_dataSeparator)
    {
    }

    bool operator()(std::string::const_iterator& next,
        const std::string::const_iterator& end, std::string& tok) const
    {
        if (next == end)
        {
            return false;
        }
        const std::string::const_iterator foundToken =
            std::search(next, end, m_str.begin(), m_str.end());
        tok.assign(next, foundToken);
        next = (foundToken == end) ? end : foundToken + m_str.size();
        return true;
    }

    void reset()
    {
    }

private:
    std::string m_str;
};

بعد أن نستطيع خلق

boost::tokenizer<FindStrTFunc> tok("some input...some other input");

واستخدام، مثل تركيزيد التعزيز المعتاد

خيار واحد هو محاولة تعزيز :: Regex. لست متأكدا من الأداء مقارنة بأمرازم مخصص.

std::string s = "dolphin--monkey--baboon";

boost::regex re("[a-z|A-Z]+|--");
boost::sregex_token_iterator iter(s.begin(), s.end() , re, 0);
boost::sregex_token_iterator end_iter;

while(iter != end_iter)
{
    std::cout << *iter << '\n';
    ++iter;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top