2011-04-27 8 views
7

के साथ नियमित अभिव्यक्तियां मैं सी ++ में एक स्ट्रिंग लेने की कोशिश कर रहा हूं और अंदर मौजूद सभी आईपी पते ढूंढता हूं, और उन्हें एक नई वेक्टर स्ट्रिंग में डालता हूं।सी ++ बूस्ट रेगेक्स

मैंने रेगेक्स पर बहुत से दस्तावेज पढ़े हैं, लेकिन मुझे यह समझ में नहीं आता कि यह सरल कार्य कैसे करें।

मेरा मानना ​​है कि मैं किसी भी आईपी पते खोजने के लिए इस पर्ल अभिव्यक्ति का उपयोग कर सकते हैं:

re("\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"); 

लेकिन मैं अभी भी कैसे आराम करने के लिए पर स्टम्प्ड रहा हूँ।

+0

क्या आपने बूस्ट रेगेक्स ट्यूटोरियल और दस्तावेज़ीकरण को आजमाया था? हमारे साथ साझा करने के लिए अब तक कुछ कोड मिला है? –

+0

आप वास्तव में उस regex के साथ मिलान करने की कोशिश कर रहे हैं? सबसे पहले एक आईपी पते से मिलान करने का प्रयास करें – snoofkin

+1

जॉन डी कुक के उत्कृष्ट ट्यूटोरियल [सी ++ टीआर 1 नियमित अभिव्यक्तियों के साथ प्रारंभ करना] (http://www.johndcook.com/cpp_regex.html) पर एक नज़र डालें। यह उन लोगों के लिए डिज़ाइन किया गया है जो पहले से ही RegEx को समझते हैं लेकिन यह पता नहीं लगा सकते कि इसे C++ में कैसे करना है। –

उत्तर

12

शायद आप इस तरह कुछ ढूंढ रहे हैं। वर्तमान पैटर्न के सभी मैचों को प्राप्त करने के लिए यह regex_iterator का उपयोग करता है। reference देखें।

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

int main() 
{ 
    std::string text(" 192.168.0.1 abc 10.0.0.255 10.5.1 1.2.3.4a 5.4.3.2 "); 
    const char* pattern = 
     "\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" 
     "\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" 
     "\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" 
     "\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b"; 
    boost::regex ip_regex(pattern); 

    boost::sregex_iterator it(text.begin(), text.end(), ip_regex); 
    boost::sregex_iterator end; 
    for (; it != end; ++it) { 
     std::cout << it->str() << "\n"; 
     // v.push_back(it->str()); or something similar  
    } 
} 

आउटपुट:

192.168.0.1 
10.0.0.255 
5.4.3.2 

साइड नोट: आप शायद \\b बजाय \b मतलब; मुझे संदेह है कि आप बैकस्पेस चरित्र से मेल खाते हैं।

+0

इटरेटर "एंड" प्रारंभ नहीं किया गया है। क्या वह ठीक है? – truthseeker

+0

@truthseeker: इसे डिफ़ॉल्ट कन्स्ट्रक्टर द्वारा प्रारंभ किया गया है। – Vitus

+1

अंत डिफ़ॉल्ट रूप से बनाया गया है, लेकिन इस एल्गोरिदम में बग (आसन्नता। बाएं औचित्य, सही औचित्य) है और रेगेक्स गलत है (और अन्यथा धीमा)। – FauChristian

-1

प्रस्तावित समाधान काफी अच्छा है, इसके लिए धन्यवाद। हालांकि मुझे पैटर्न में थोड़ी गलती मिली।

उदाहरण के लिए, 49.000.00.01 की तरह कुछ वैध आईपीवी 4 पते के रूप में लिया जाएगा और मेरी समझ से, यह नहीं होना चाहिए (बस कुछ डंप प्रसंस्करण के दौरान मेरे साथ हुआ)।

मैं में गपशप में सुधार के लिए सुझाव:

"\\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)" 
"\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)" 
"\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)" 
"\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\\b"; 

यह केवल 0.0.0.0 के रूप में सब-शून्य-में है, जो मैं सही होने के लिए लगता है की अनुमति चाहिए और यह सब .00 समाप्त करेंगे। .000। आदि

0
#include <string> 
#include <list> 
#include <boost/regex.hpp> 
typedef std::string::const_iterator ConstIt; 

int main() 
{ 
    // input text, expected result, & proper address pattern 
    const std::string sInput 
    (
      "192.168.0.1 10.0.0.255 abc 10.5.1.00" 
      " 1.2.3.4a 168.72.0 0.0.0.0 5.4.3.2" 
    ); 
    const std::string asExpected[] = 
    { 
     "192.168.0.1", 
     "10.0.0.255", 
     "0.0.0.0", 
     "5.4.3.2" 
    }; 
    boost::regex regexIPs 
    (
     "(^|[ \t])(" 
     "(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])[.]" 
     "(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])[.]" 
     "(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])[.]" 
     "(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])" 
     ")($|[ \t])" 
    ); 

    // parse, check results, and return error count 
    boost::smatch what; 
    std::list<std::string> ns; 
    ConstIt end = sInput.end(); 
    for (ConstIt begin = sInput.begin(); 
       boost::regex_search(begin, end, what, regexIPs); 
       begin = what[0].second) 
    { 
     ns.push_back(std::string(what[2].first, what[2].second)); 
    } 

    // check results and return number of errors (zero) 
    int iErrors = 0; 
    int i = 0; 
    for (std::string & s : ns) 
     if (s != asExpected[i ++]) 
      ++ iErrors; 
    return iErrors; 
}