के साथ boost :: tokenizer का उपयोग करके मैं boost :: tokenizer देख रहा हूं, और मैंने पाया है कि दस्तावेज़ीकरण बहुत पतला है। क्या इसे "डॉल्फिन - बंदर - बाबून" जैसी स्ट्रिंग को टोकन बनाना संभव है और प्रत्येक शब्द को टोकन बनाते हैं, साथ ही हर डबल डैश को टोकन बनाते हैं? उदाहरणों से मैंने केवल एक चरित्र डिलीमीटर की अनुमति दी है। क्या लाइब्रेरी अधिक जटिल डिलीमीटर के लिए पर्याप्त उन्नत नहीं है?स्ट्रिंग delimiters
उत्तर
ऐसा लगता है कि आप जो चाहते हैं उसे करने के लिए आपको अपना खुद का TokenizerFunction लिखना होगा।
मैं देखता हूं। मैं उम्मीद कर रहा था कि कुछ पूर्व निर्मित होगा, लेकिन मुझे लगता है कि मैं बहुत ज्यादा उम्मीद कर रहा था। – Martin
एक विकल्प boost :: 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;
}
यह अच्छा है। अगर यह काम करता है, तो यह मेरा वोट प्राप्त करता है। :) –
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'; ;
}
इस पूरे स्ट्रिंग की एक प्रति बनाने का नकारात्मक पक्ष है। यदि टोकननाइज्ड स्ट्रिंग बड़ी है, तो यह एक समस्या है। बूस्ट टोकननाइज़र ऐसा नहीं करता है। –
मैं जानता हूँ कि विषय काफी पुराना है, लेकिन यह गूगल में शीर्ष लिंक में दिखाया गया है मैं जब खोज "स्ट्रिंग से 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");
बना सकते हैं और
कार्यान्वयन आदर्श नहीं है (बग हो सकता है), यह सिर्फ एक उदाहरण है – Alek86
बस उत्सुक क्यों इस समुदाय विकी चिह्नित है tokenizer एक सामान्य बढ़ावा तरह उपयोग करते हैं, कर सकते हैं? –
मैंने सोचा कि यह दूसरों को मेरे प्रश्न को स्पष्ट करने की अनुमति देगा यदि यह थोड़ा फैल गया था। शायद मुझे अगली बार तक क्या करना है, इसे पढ़ना चाहिए। – Martin