2013-05-25 4 views
10

द्वारा स्प्लिट स्ट्रिंग मैं std::stringregex द्वारा विभाजित करना चाहता हूं।सी ++ - रेगेक्स

मुझे स्टैक ओवरफ्लो पर कुछ समाधान मिल गए हैं, लेकिन उनमें से अधिकतर एकल स्थान से स्ट्रिंग स्ट्रिंग या बूस्ट जैसे बाहरी पुस्तकालयों का उपयोग कर रहे हैं।

मैं बूस्ट का उपयोग नहीं कर सकता।

मैं स्ट्रिंग - "\\s+" द्वारा स्ट्रिंग को विभाजित करना चाहता हूं।

मैं इस जी ++ संस्करण g++ (Debian 4.4.5-8) 4.4.5 का उपयोग कर रहा हूं और मैं अपग्रेड नहीं कर सकता।

+0

क्या आपने '+' – Anirudha

+0

कोशिश की है सही पता है कि मैं इस Funct का उपयोग कर रहा हूँ आयनों को विभाजित करने के लिए आयन: http://stackoverflow.com/a/236803/418518 यह केवल __single char__ द्वारा काम करता है। रेगेक्स प्रारूप सही है, मैंने पहले ही उसे एक जावा प्रोजेक्ट में इस्तेमाल किया है। काम करता है शानदार। –

+0

समस्या यह है कि मुझे सी ++ बहुत कुछ नहीं पता ... और मैं सिर्फ पुराने सी ++ मानक ('सी ++ 03' शायद) का उपयोग करके 'std :: string' को विभाजित करने के बारे में जानना चाहता हूं)। यदि आपके पास कुछ लिंक/कोड हैं तो बस इसे पेस्ट करें। :) धन्यवाद! –

उत्तर

8

यदि आप एकाधिक रिक्त स्थान से स्ट्रिंग को विभाजित करना चाहते हैं तो आपको नियमित अभिव्यक्तियों का उपयोग करने की आवश्यकता नहीं है। अपनी खुद की रेगेक्स लाइब्रेरी लिखना इतना आसान है कि कुछ आसान है।

आपके द्वारा लिखे गए उत्तर में आपकी प्रतिक्रिया, Split a string in C++?, आसानी से बदला जा सकता है ताकि इसमें कई रिक्त स्थान होने पर कोई रिक्त तत्व शामिल न हो।

std::vector<std::string> &split(const std::string &s, char delim,std::vector<std::string> &elems) { 
    std::stringstream ss(s); 
    std::string item; 
    while (std::getline(ss, item, delim)) { 
     if (item.length() > 0) { 
      elems.push_back(item); 
     } 
    } 
    return elems; 
} 


std::vector<std::string> split(const std::string &s, char delim) { 
    std::vector<std::string> elems; 
    split(s, delim, elems); 
    return elems; 
} 

जाँच कि item.length() > 0elems वेक्टर करने पर जोर दे रहा item तुम अब अतिरिक्त तत्वों मिल जाएगा अगर आपके इनपुट (आपके मामले में रिक्त स्थान) कई सीमांकक शामिल

+0

ठीक है, हमने एक ही समय में उसी तरह से पता लगाया। :) लेकिन आप वास्तव में एसओ पर जवाब देने में तेजी से (~ 10 मिनट) थे। +1 और स्वीकार करें। –

+2

आपको इस तथ्य से भी सहमत होना चाहिए कि स्ट्रिंग स्ट्रिंग करने के लिए सी ++ का उपयोग करना भी अधिक ओवरकिल जैसा दिखता है, सी # में आप बस 'str.split (...)';) – Lu4

31
std::regex rgx("\\s+"); 
std::sregex_token_iterator iter(string_to_split.begin(), 
    string_to_split.end(), 
    rgx, 
    -1); 
std::sregex_token_iterator end; 
for (; iter != end; ++iter) 
    std::cout << *iter << '\n'; 

-1 से पहले तक की कुंजी है यहां: जब इटरेटर को पाठ से पहले पाठक पर इटेटरेटर बिंदु बनाया जाता है और प्रत्येक वृद्धि के बाद इटेटरेटर पिछले मैच के बाद वाले टेक्स्ट पर इंगित करता है।

यदि आपके पास सी ++ 11 नहीं है, तो बूस्ट के साथ एक ही चीज़ TR1 या संभवतः मामूली संशोधन के साथ काम करना चाहिए।

std::vector<std::string> 
    resplit(const std::string & s, std::string rgx_str = "\\s+") { 


     std::vector<std::string> elems; 

     std::regex rgx (rgx_str); 

     std::sregex_token_iterator iter(s.begin(), s.end(), rgx, -1); 
     std::sregex_token_iterator end; 

     while (iter != end) { 
      //std::cout << "S43:" << *iter << std::endl; 
      elems.push_back(*iter); 
      ++iter; 
     } 

     return elems; 

    } 

यह इस प्रकार काम करता है::

+0

आपको 'sregex_token_iterator' का उपयोग करने की आवश्यकता है, है ना? – Narek

+1

@Narek - या तो, या स्पष्ट टेम्पलेट तर्क जोड़ें: 'regex_token_iterator '। 'sregex_token_iterator' आसान है। फिक्स्ड। धन्यवाद। –

+0

[cplusplus.com संदर्भ दस्तावेज़] पर अंतिम उदाहरण (http://www.cplusplus.com/reference/regex/regex_token_iterator/regex_token_iterator/) इस उत्तर के समान है – solstice333

6

@Pete बेकर ने जवाब मुझे लगता है कि regexp का उपयोग करके पाठ विभाजित करने के लिए इस्तेमाल किया जा सकता resplit समारोह का एक उदाहरण प्रदान करते हैं पर विस्तार करने के लिए

string s1 = "first second third "; 
    vector<string> v22 = my::resplit(s1); 

    for (const auto & e: v22) { 
     cout <<"Token:" << e << endl; 
    } 


    //Token:first 
    //Token:second 
    //Token:third 


    string s222 = "first|second:third,forth"; 
    vector<string> v222 = my::resplit(s222, "[|:,]"); 

    for (const auto & e: v222) { 
     cout <<"Token:" << e << endl; 
    } 


    //Token:first 
    //Token:second 
    //Token:third 
    //Token:forth 
0
string s = "foo bar baz"; 
regex e("\\s+"); 
regex_token_iterator<string::iterator> i(s.begin(), s.end(), e, -1); 
regex_token_iterator<string::iterator> end; 
while (i != end) 
    cout << " [" << *i++ << "]"; 

प्रिंट [foo] [bar] [baz]