2013-02-02 15 views
5

मैंने सी ++ 11 की नई रेगेक्स लाइब्रेरी के लिए कई स्रोतों को देखा है, लेकिन उनमें से अधिकतर वाक्यविन्यास पर अधिक ध्यान केंद्रित करते हैं, या regex_match जैसी चीजों का अधिक बुनियादी उपयोग करते हैं, या regex_search। हालांकि इन लेखों ने मुझे रेगेक्स लाइब्रेरी का उपयोग शुरू करने में मदद की, मुझे कैप्चर समूहों पर अधिक जानकारी खोजने में मुश्किल हो रही है।सी ++ 11 रेगेक्स कैप्चर समूह पहचानकर्ता

जो मैं पूरा करने की कोशिश कर रहा हूं, यह पता लगाया गया है कि कौन सा कैप्चर समूह एक मैच है। अब तक, मुझे यह करने का एकमात्र तरीका मिला है।

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

int main(int argc, char** argv) 
{ 
    std::string input = "+12 -12 -13 90 qwerty"; 
    std::regex pattern("([+-]?[[:digit:]]+)|([[:alpha:]]+)"); 

    auto iter_begin = std::sregex_token_iterator(input.begin(), input.end(), pattern, 1); 
    auto iter_end = std::sregex_token_iterator(); 

    for (auto it = iter_begin; it != iter_end; ++it) 
    { 
     std::ssub_match match = *it; 
     std::cout << "Match: " << match.str() << " [" << match.length() << "]" << std::endl; 
    } 

    std::cout << std::endl << "Done matching..." << std::endl; 
    std::string temp; 
    std::getline(std::cin, temp); 

    return 0; 
} 

std::sregex_token_iterator के चौथे तर्क के मान को परिवर्तित करने में, मैं जो submatch यह रखना होगा यह कह उनमें से बाकी फेंक नियंत्रित कर सकते हैं। इसलिए, यह पता लगाने के लिए कि कौन सा कैप्चर समूह एक मैच है, मैं यह जानने के लिए कैप्चर समूहों के माध्यम से बस फिर से चला सकता हूं कि किसी विशेष समूह के लिए कौन से मैचों को फेंक दिया नहीं जाता है।

हालांकि, इस, मेरे लिए अवांछनीय हो क्योंकि मैं std::sregex_token_iterator में से प्रत्येक के निर्माण उम्मीद करेंगे जब तक कि वहाँ कुछ कैशिंग पृष्ठभूमि में चल रहा है मैचों इनपुट फिर से गुजरती हैं और पता लगाने के लिए होगा (किसी ने मुझे सही करें अगर यह है गलत है, लेकिन यह सबसे अच्छा निष्कर्ष है कि मैं आ सकता हूं)।

क्या कैप्चर समूह (ओं) का मिलान करने का कोई बेहतर तरीका है? या सबमिशन पर कार्रवाई का सबसे अच्छा तरीका है?

उत्तर

5

इसके बजाय regex_iterator का उपयोग करें। प्रत्येक मैच के लिए आपके पास match_results तक पहुंच होगी, जिसमें सभी sub_match es शामिल हैं, जहां आप जांच सकते हैं कि मिलान का कौन सा कैप्चरिंग समूह संबंधित है।

+0

आपको बहुत बहुत धन्यवाद, जो वास्तव में काम करता था, मैंने आशा की थी। – TheCodeBroski

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