2011-11-27 14 views
9

मैं सी ++ 11 के std::regex का उपयोग कर मैचों की संख्या कैसे गिन सकता हूं?मैचों की संख्या

std::regex re("[^\\s]+"); 
std::cout << re.matches("Harry Botter - The robot who lived.").count() << std::endl; 

अपेक्षित उत्पादन:

7

+2

और अपने उत्पादन .... है –

+0

@EdHeal मैं एक [संकलन त्रुटि] मिल (http://ideone.com/uxyrV): 'त्रुटि: इस दायरे में 'regex_count' घोषित नहीं किया गया था। ;) –

उत्तर

15

आप regex_iterator का उपयोग मैचों में से सभी उत्पन्न करने के लिए कर सकते हैं, तो distance का उपयोग उनकी गणना:

std::regex const expression("[^\\s]+"); 
std::string const text("Harry Botter - The robot who lived."); 

std::ptrdiff_t const match_count(std::distance(
    std::sregex_iterator(text.begin(), text.end(), expression), 
    std::sregex_iterator())); 

std::cout << match_count << std::endl; 
+0

क्या आप समझा सकते हैं कि 'std :: sregex_iterator' रिटर्न और दोनों के बीच' दूरी 'क्या है? –

+1

@muntoo: 'sregex_iterator'' regex_iterator' पर एक टाइपिफ़ है, जो टेक्स्ट के सभी मैचों में पुनरावृत्त होता है। 'दूरी' मानक लाइब्रेरी फ़ंक्शन है जो एक इटरेटर रेंज में तत्वों की संख्या की गणना करता है (इसलिए, इस मामले में, यह सभी मैचों को पढ़ता है और कितने हैं) देता है। –

+0

हाय। यहां तक ​​कि यदि यह एक पुराना धागा है: मुझे लगता है कि आप match_count ऑपरेशन को छोड़ सकते हैं (जो C++ 11 में मौजूद नहीं है), जैसा कि (w) sregex :: iterator पहले से ही पुनरावृत्त करता है, जैसा कि आप स्वयं का उल्लेख करते हैं, मैचों में। इस प्रकार std :: दूरी मैच गिनती वापस करनी चाहिए। मैंने gcc 4.6.1 और VS 2013 का उपयोग match_count के बिना करने की कोशिश की और यह ठीक काम करता है। – gilgamash

3

आप इस का उपयोग कर सकते हैं:

int countMatchInRegex(std::string s, std::string re) 
{ 
    std::regex words_regex(re); 
    auto words_begin = std::sregex_iterator(
     s.begin(), s.end(), words_regex); 
    auto words_end = std::sregex_iterator(); 

    return std::distance(words_begin, words_end); 
} 

उदाहरण उपयोग:

std::cout << countMatchInRegex("Harry Botter - The robot who lived.", "[^\\s]+"); 

आउटपुट:

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