2011-05-26 16 views
5

पर्ल में regex बराबर है, मैं यह कर सकता:std :: '/ जी' वैश्विक संशोधक

$text = '1747239'; 
@matches = ($text =~ m/(\d)/g); 
# @matches now contains ('1', '7', '4', '7', '2', '3', '9') 

सी ++ रेगुलर एक्सप्रेशन मिलान का उपयोग करना, सबसे अच्छा तरीका है तो इस व्यवहार को दोहराने के लिए है कि मैं एक मैच मिल क्या सभी मैचों सहित सेट?

मैं इस समय इस राशि: -

compiledRegex = std::regex(regex, std::tr1::regex_constants::extended); 
regex_search(text, results, compiledRegex); 

int count = results.size(); 
// Alloc pointer array based on count * sizeof(mystruct). 
for (std::cmatch::iterator match = results.begin(); 
     match != results.end(); 
     ++match) 
{ 
    // Do something with match; 
} 

हालांकि यह केवल मुझे पहला मैच, बस पर्ल की तरह बिना/जी दे देंगे जो ठीक है, लेकिन मैं/जी प्रभाव चाहते हैं।

तो, क्या ऐसा करने का कोई अच्छा तरीका है, या मुझे रेगेक्स को और अधिक चलाना जारी रखना चाहिए?

उत्तर

8

आपको कई बार regex_search पर कॉल करना चाहिए। इसका वापसी मूल्य निर्दिष्ट करता है कि क्या अधिक मिलान हैं या नहीं। प्रत्येक बार जब आप इसे कॉल करते हैं तो आपको एक नया मैच मिलता है। परिणामों द्वारा लौटाए गए इटरेटर आपके नियमित अभिव्यक्ति में परिभाषित समूह सबमिशन पर जाते हैं। पहली प्रविष्टि हमेशा की तरह, पूरे मैच है इसलिए आपके मामले में count == 1

std::string::const_iterator text_iter = text.cbegin(); 
compiledRegex = std::regex(regex, std::tr1::regex_constants::extended); 

while (regex_search(text_iter, text.end(), results, compiledRegex)) 
{ 
    int count = results.size(); 
    // Alloc pointer array based on count * sizeof(mystruct). 
    for (std::cmatch::iterator group = results.begin(); 
      group != results.end(); 
      ++group) 
    { 
     // If you uses grouping in your search here you can access each group 
    } 

    std::cout << std::string(results[0].first, results[0].second) << endl; 
    text_iter = results[0].second; 
} 

आशा है कि यह

+0

में मदद करता है यही कारण है कि काफी क्या मैं के साथ समापन किया गया है, मुझे लगता है कि मुझे उम्मीद थी एक झंडा regex_search कर बनाने के लिए यह। संभवतः आपको पाठ संकेतक को प्रत्येक पुनरावृत्ति पर अंतिम मैच के अंत में स्थानांतरित करने की आवश्यकता है? –

+0

@ जोनबी आप सही हैं। स्ट्रिंग के बजाय इटरेटर का उपयोग किया जाना चाहिए। प्रत्येक पुनरावृत्ति के अंत में, 'परिणाम [0] .second' का उपयोग करके खोज इटरेटर को अद्यतन किया जाना चाहिए। मैंने अपना जवाब corespodingly अद्यतन किया है। – Eugene

संबंधित मुद्दे