2009-06-14 7 views
9

का उपयोग कर एक स्ट्रिंग को टोकननाइज़ करें मैं इस समय स्क्रैच से कुछ सी ++ सीखने की कोशिश कर रहा हूं।
मैं पाइथन, पर्ल, जावास्क्रिप्ट में अच्छी तरह से परिचित हूं लेकिन अतीत में कक्षा सेटिंग में केवल सी ++ का सामना करना पड़ा है। कृपया मेरे प्रश्न के naivete बहाना।सी ++ एक नियमित अभिव्यक्ति

मैं नियमित अभिव्यक्ति का उपयोग करके एक स्ट्रिंग को विभाजित करना चाहता हूं लेकिन को सी ++ में ऐसा करने का एक स्पष्ट, निश्चित, कुशल और पूर्ण उदाहरण खोजने में बहुत भाग्य नहीं मिला है।

पर्ल में इस,

/home/me$ cat test.txt 
this is aXstringYwith, some problems 
and anotherXY line with similar issues 

/home/me$ cat test.txt | perl -e' 
> while(<>){ 
> my @toks = split(/[\sXY,]+/); 
> print join(" ",@toks)."\n"; 
> }' 
this is a string with some problems 
and another line with similar issues 

मैं कैसे सी में बराबर पूरा करने के लिए सबसे अच्छा ++ जानना चाहते हैं कार्रवाई आम है है, और इस तरह एक छोटी सी ढंग से पूरा किया जा सकता।

संपादित करें:
मुझे लगता है कि मैंने पाया कि मैं बूस्ट लाइब्रेरी में जो खोज रहा था, उसे नीचे बताया गया है।

boost regex-token-iterator (क्यों अंडरस्कोर काम नहीं करते?)

मुझे लगता है मैं के लिए खोज करने के लिए क्या नहीं पता था।


#include <iostream> 
#include <boost/regex.hpp> 

using namespace std; 

int main(int argc) 
{ 
    string s; 
    do{ 
    if(argc == 1) 
     { 
     cout << "Enter text to split (or \"quit\" to exit): "; 
     getline(cin, s); 
     if(s == "quit") break; 
     } 
    else 
     s = "This is a string of tokens"; 

    boost::regex re("\\s+"); 
    boost::sregex_token_iterator i(s.begin(), s.end(), re, -1); 
    boost::sregex_token_iterator j; 

    unsigned count = 0; 
    while(i != j) 
     { 
     cout << *i++ << endl; 
     count++; 
     } 
    cout << "There were " << count << " tokens found." << endl; 

    }while(argc == 1); 
    return 0; 
} 

+1

आपके द्वारा जोड़े जाने हिस्सा अपने स्वयं के प्रश्न का उत्तर के रूप में के बजाय यह अपने प्रश्न का हिस्सा बनने के होने का "अपने दम पर पाया" चाहिए ... हालांकि उल्लेख है कि आप इसे मिल गया है और जवाब पोस्ट किया। यदि कोई और साथ आता है और यह प्रश्न उपयोगी लगता है ... वे समुदाय को आपके चुने हुए उत्तर के साथ चयनित उत्तर देखना चाहते हैं। आपका उत्तर कम्युनिस्ट्स की सबसे अच्छी पसंद नहीं हो सकता है। –

उत्तर

14

बढ़ावा पुस्तकालयों आम तौर पर एक अच्छा विकल्प है, इस मामले Boost.Regex में हैं। एक स्ट्रिंग को टोकन में विभाजित करने के लिए an example भी है जो पहले से ही आप जो चाहते हैं वह करता है। मूल रूप से यह कुछ इस तरह करने के लिए नीचे आता है:

boost::regex re("[\\sXY]+"); 
std::string s; 

while (std::getline(std::cin, s)) { 
    boost::sregex_token_iterator i(s.begin(), s.end(), re, -1); 
    boost::sregex_token_iterator j; 
    while (i != j) { 
    std::cout << *i++ << " "; 
    } 
    std::cout << std::endl; 
} 
+0

हालांकि मुझे ओबेरॉय की पोस्ट से regex_token_iterator का अपना रास्ता मिला, मैंने इसे एक उत्तर के रूप में चुना क्योंकि यह एक संक्षिप्त, कामकाजी उदाहरण देता है, और उपयुक्त बूस्ट पेज के लिंक को शामिल करता है। खुश होती है। –

1

पर्ल में विपरीत, नियमित अभिव्यक्तियां सी ++ में "निर्मित" नहीं होती हैं।

आपको बाहरी पुस्तकालय, जैसे PCRE का उपयोग करने की आवश्यकता है।

+0

क्या इसमें एक 'विभाजन' फ़ंक्शन भी शामिल है? पायथन में एक डिफ़ॉल्ट नियमित अभिव्यक्ति मॉड्यूल, 'पुनः' होता है, जो स्ट्रिंग स्प्लिटिंग सुविधा फ़ंक्शन प्रदान करता है। मुझे आश्चर्य है कि यह वही काम करता है? –

+0

यह उत्तर सबमिट होने पर सत्य था, लेकिन सी ++ 11 की उपलब्धता के साथ अब सत्य नहीं है। '# शामिल करें ' – Justin

3

Boost.Regex देखें। मुझे लगता है कि आप यहां अपना उत्तर पा सकते हैं:

C++: what regex library should I use?

+0

धन्यवाद, मुझे इस से regex_token_iterator का रास्ता मिला। –

2

आप iterators के उपयोग को कम करने, और अपने कोड pithify चाहते हैं, निम्नलिखित काम करना चाहिए:

#include <string> 
#include <iostream> 
#include <boost/regex.hpp> 

int main() 
{ 
    const boost::regex re("[\\sXY,]+"); 

    for (std::string s; std::getline(std::cin, s);) 
    { 
    std::cout << regex_replace(s, re, " ") << std::endl; 
    } 

} 
1

Regex TR1 के हिस्से के दृश्य में शामिल कर रहे हैं सी ++ 2008 एसपी 1 (एक्सप्रेस संस्करण सहित) और जी ++ 4.3।

हैडर <regex> और नामस्थान std :: tr1 है। एसटीएल के साथ महान काम करता है।

Getting started with C++ TR1 regular expressions

Visual C++ Standard Library : TR1 Regular Expressions