2015-10-15 10 views
8

के सभी संभावित मिलान कैसे प्राप्त करें मैं रेगेक्स के सभी संभावित मैचों को ढूंढना चाहता हूं, यह कैसे संभव है?std :: regex

regex rx("(2|25)"); 
string s = "2225"; 
for (sregex_iterator it(s.begin(), s.end(), rx), end; it != end; ++it) { 
    cout << it->position() << ": " << it->str() << endl; 
} 

उत्पादन देता है:

0: 2 
1: 2 
2: 25 

लेकिन तीसरे 2: 2 बिल्कुल नहीं मिल रहा। मैं एक ही समय में कई टोकन खोजने के लिए O(n) जटिलता के कारण रेगेक्स का उपयोग करना पसंद करता हूं।

अद्यतन:

हो सकता है कि गैर prefixable सूची में टोकन सूची विभाजित है और कई regexes बनाने? उदाहरण के लिए: (2|4|25|45|251|455|267) =>(2|4), (25|45|267), (251|455) इस जटिलता कुछ करने के लिए की तरह O(n log(m))

अद्यतन बढ़ेगा 2:

कृपया, गैर prefixable वैक्टर के बंटवारे टोकन वेक्टर की कमी एसटीएल आधारित एल्गोरिथ्म प्रदान इस प्रश्न का उत्तर दो।

+0

यदि आप केवल '2' पर मैच चाहते हैं तो आप '| 25' का उपयोग क्यों करते हैं आपका रेगेक्स? – Phylogenesis

+0

@ फिजोजेनेसिस मैं 'ओ (एन)' जटिलता के लिए सभी 4 मैचों की खोज करना चाहता हूं :) – k06a

+0

मेरा मानना ​​है कि आप एक ही चरित्र से दो अलग-अलग मिलान समूहों में मेल नहीं खा सकते हैं (यानी आप भाग के रूप में '2' से मिलान नहीं कर पाएंगे '25' लेकिन अपने आप पर भी)। – Phylogenesis

उत्तर

2

मुझे नहीं लगता कि यह एक पुनरावर्तक और एक regexp के साथ संभव है। यहां देखिए यह कैसे काम करता है।

आपकी regexp एक सबस्ट्रिंग के लिए खोज करता है जो या तो "2" या "25" है। अब, आप sregex_iterator के साथ खोज शुरू करते हैं। यह स्ट्रिंग के पहले प्रतीक के साथ शुरू होता है, और आपकी नियमित अभिव्यक्ति के साथ मिलान खोजने का प्रयास करता है। यदि कोई मैच है, तो यह "रिकॉर्ड किया गया" है, और इटेटरेटर मैच के बाद स्थिति में उन्नत है। यदि कोई मिलान नहीं है, तो इटेटरेटर उन्नत 1 स्थिति आगे है। यह प्रक्रिया तब तक जारी है जब तक स्ट्रिंग का अंत तक नहीं पहुंच जाता है।

अब, प्रत्येक बार जब यह एक मैच पाता है तो यह आपकी नियमित अभिव्यक्ति से सर्वश्रेष्ठ (यानी, सबसे लंबा) मैच खोजने का प्रयास करेगा। तो यदि कोई सबस्ट्रिंग 2 और 25 दोनों से मेल खाता है, तो यह 25 लेगा क्योंकि यह लंबा है। तो मैं कहूंगा कि आपको 2 नियमित अभिव्यक्तियों की आवश्यकता है।

+0

मुझे नियमित अभिव्यक्ति से बचने में मदद करें, प्रत्येक में केवल 1 टोकन होगा :) जटिलता 'ओ (एनएम)' बढ़ जाती है :( – k06a

+1

मुझे नहीं लगता कि यह वास्तव में मेल खाता है सबसे लंबा मैच, यह * पहले * मैच से मेल खाता है। वैकल्पिक मामलों का क्रम: इसे देखें [उदाहरण] (http://ideone.com/Jgq9pZ)। – Phylogenesis

+0

@ फिजोजेनेसिस, यह आकर्षक है क्योंकि मेरी मशीन पर परिणाम बिल्कुल सही है विपरीत ('rx1' पाता है '2 2 25' और' rx2' पाता है '2 2 2') – SingerOfTheFall

1

आप तीसरे '2' प्राप्त नहीं कर सकते हैं, क्योंकि regexes हमेशा सबसे लंबा मैच लौटाते हैं। "सभी संभावित मैचों" प्राप्त करने के लिए आपको दो बार क्वेरी चलाने की आवश्यकता है, क्योंकि 2 25 में निहित है।