2012-06-05 17 views
8

निम्नलिखित आउटपुट "> हट" जहां मैं इसे "हट" आउटपुट करने की अपेक्षा करता हूं। मुझे पता है। * लालची है लेकिन> मिलान किया जाना चाहिए और यह कैप्चर समूह के बाहर है तो यह मेरे सबमिशन में क्यों है?सी ++ regex समझ नहीं

#include <string> 
#include <regex> 
#include <iostream> 

using namespace std; 

int main() { 
     regex my_r(".*>(.*)"); 
     string temp(R"~(cols="64">Hut)~"); 
     smatch m; 
     if (regex_match(temp, m, my_r)) { 
       cout << m[1] << endl; 
     } 
} 
+0

ध्यान दें कि regex कार्यान्वयन समर्थन अभी भी जीसीसी और एमएसवीसी पर बहुत कम है। – inf

+0

धन्यवाद, मैं जीसीसी 4.6.3 का उपयोग कर रहा हूँ। –

+0

मैंने जी ++ 4.7 में अपग्रेड किया, लेकिन फिर भी वही आउटपुट। मुझे अभी भी लगता है कि यह मेरे हिस्से पर regexes की एक गलतफहमी है। अतीत में मैंने अपनी त्रुटियों के लिए अक्सर सॉफ्टवेयर को दोषी ठहराया है। –

उत्तर

7

यह libstdC++ के कार्यान्वयन में एक बग है। इन देखें:

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

int main() { 
    { 
     using namespace std; 
     regex my_r("(.*)(6)(.*)"); 
     smatch m; 
     if (regex_match(std::string{"123456789"}, m, my_r)) { 
      std::cout << m.length(1) << ", " 
         << m.length(2) << ", " 
         << m.length(3) << std::endl; 
     } 
    } 

    { 
     using namespace boost; 
     regex my_r("(.*)(6)(.*)"); 
     smatch m; 
     if (regex_match(std::string{"123456789"}, m, my_r)) { 
      std::cout << m.length(1) << ", " 
         << m.length(2) << ", " 
         << m.length(3) << std::endl; 

     } 
    } 

    return 0; 
} 

आप जीसीसी के साथ संकलन हैं, तो पहले एक (libstdC++) देता है पूरी तरह से गलत परिणाम 9, -2, 4 और दूसरा एक (बढ़ावा के कार्यान्वयन) रिटर्न 5, 1, 3 अपेक्षित के रूप में

यदि आप क्लैंग + libC++ के साथ संकलित करते हैं, तो आपका कोड ठीक काम करता है।

(ध्यान दें कि libstdC++ के regex कार्यान्वयन केवल "आंशिक रूप से समर्थित" है, http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52719 में वर्णित है।)

+0

ओह, यह एकवचन कष्टप्रद है। एक और वाक्यविन्यास विकल्प चुनने का कोई मौका? ऐसा नहीं है कि मैं * ईसीएमए-स्क्रिप्ट के अलावा कुछ और चाहता हूं ... लेकिन अगर यह काम नहीं करता है ... (संयोग से, मैंने अब सोचना शुरू कर दिया है कि वे पीसीआरई के साथ क्यों नहीं गए थे)। –

+0

वैसे, बग अभी भी जीसीसी 4.7 में मौजूद है। –

+0

उदाहरण और स्पष्टीकरण के लिए धन्यवाद। मुझे लगता है कि अगर यह केवल आंशिक रूप से समर्थित है तो मुझे उम्मीद करने के लिए उचित नहीं है। मैं या तो समय के लिए बढ़ावा या regexes से बचने के लिए उपयोग करेंगे। –

3

आप अपने नियमित अभिव्यक्ति सुधार सकते हैं ताकि मिलान किया भागों समूहों में विभाजित हैं:

std::regex my_r("(.*)>(.*)\\).*"); // group1>group2).* 
std::string temp("~(cols=\"64\">Hut)~"); 
std::sregex_iterator reg_it(temp.begin(), temp.end(), my_r); 

if (reg_it->size() > 1) { 
    std::cout 
     << "1: " << reg_it->str(1) << std::endl // group1 match 
     << "2: " << reg_it->str(2) << std::endl; // group2 match 
} 

आउटपुट :

1: ~(cols="64" 
2: Hut 

ध्यान दें कि समूहों bracets (/* your regex here */) द्वारा निर्दिष्ट कर रहे हैं और आप में से एक bracet हिस्सा बनाना चाहते हैं तो आपकी अभिव्यक्ति, तो आपको इसे \ से बचने की आवश्यकता है, जो कोड में \\ है। अधिक जानकारी के लिए Grouping Constructs देखें।

यह सवाल भी आपकी मदद कर सकते हैं: How do I loop through results from std::regex_search?

इसके अलावा अपने फ़ाइलों की शुरुआत में using namespace std; का उपयोग नहीं करते हैं, यह एक बुरा व्यवहार है।

+0

आपके उत्तर के लिए धन्यवाद और 'नामस्थान std;' का उपयोग करने के संबंध में आपकी युक्ति के लिए धन्यवाद। मैं स्पष्टीकरण की सराहना करता हूं! –

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