2010-02-08 20 views
10

पर सी ++ के साथ नियमित अभिव्यक्तियों का उपयोग करना मैं खुद रेगेक्स से परिचित हूं, लेकिन जब भी मैं यूनिक्स कंप्यूटर के साथ रेगेक्स का उपयोग करने के लिए कोई उदाहरण या दस्तावेज ढूंढने का प्रयास करता हूं, तो मुझे रीजिक्स लिखने या इसका उपयोग करने के तरीकों पर ट्यूटोरियल मिलते हैं। विंडोज के लिए उपलब्ध नेट विशिष्ट पुस्तकालय। मैं थोड़ी देर के लिए खोज कर रहा हूं और मुझे यूनिक्स मशीनों पर सी ++ रेगेक्स पर कोई अच्छा ट्यूटोरियल नहीं मिल रहा है।यूनिक्स

मुझे क्या करना कोशिश कर रहा हूँ:

यह टूट रहा और उसके बाद विभिन्न उपसमूहों पढ़कर regex का उपयोग कर एक स्ट्रिंग पार्स। एक PHP अनुरूप बनाने के लिए, preg_match की तरह कुछ जो सभी $ मैचों को लौटाता है।

+0

यही होगी 'preg_match_all (...)' तो, नहीं 'preg_match (...)'। –

+1

संभवतः क्योंकि C++ मानक किसी भी नियमित अभिव्यक्ति वर्ग निर्दिष्ट नहीं करता है। –

+0

नील, लेकिन सभी PHP के बाद भी मानक प्रदान नहीं करता है ;-) –

उत्तर

13

Boost.Regex का उपयोग करने पर विचार करें।

(वेबसाइट से) एक उदाहरण:

bool validate_card_format(const std::string& s) 
{ 
    static const boost::regex e("(\\d{4}[- ]){3}\\d{4}"); 
    return regex_match(s, e); 
} 

एक और उदाहरण:

// match any format with the regular expression: 
const boost::regex e("\\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z"); 
const std::string machine_format("\\1\\2\\3\\4"); 
const std::string human_format("\\1-\\2-\\3-\\4"); 

std::string machine_readable_card_number(const std::string s) 
{ 
    return regex_replace(s, e, machine_format, boost::match_default | boost::format_sed); 
} 

std::string human_readable_card_number(const std::string s) 
{ 
    return regex_replace(s, e, human_format, boost::match_default | boost::format_sed); 
} 
0

आप regcomp, regexec and regfree देख रहे हैं।

इस बारे में सावधान रहना एक बात यह है कि पॉज़िक्स नियमित अभिव्यक्ति वास्तव में दो अलग-अलग भाषाओं को लागू करती है, नियमित (डिफ़ॉल्ट) और विस्तारित (कॉल को रेगकोप में कॉल में REG_EXTENDED शामिल करें)। यदि आप PHP दुनिया से आ रहे हैं, तो विस्तारित भाषा आपके द्वारा उपयोग की जाने वाली चीज़ के करीब है।

+0

@epatel –

9

TR1 regexes या (लगभग समकक्ष) बूस्ट regex के लिए प्रलेखन देखें। दोनों विभिन्न यूनिक्स सिस्टम पर काफी अच्छी तरह से काम करते हैं। टीआर 1 रेगेक्स कक्षाओं को सी ++ 0x में स्वीकार कर लिया गया है, हालांकि वे अभी तक मानक का हिस्सा नहीं हैं, वे जल्द ही उचित होंगे।

संपादित करें: उपसमूहों में एक स्ट्रिंग को तोड़ने के लिए, आप एक sregex_token_iterator का उपयोग कर सकते हैं। आप या तो टोकन के रूप में मिलान करना चाहते हैं, या जो आप विभाजक के रूप में मिलान करना चाहते हैं उसे निर्दिष्ट कर सकते हैं।

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

int main() { 

    std::string line; 

    std::cout << "Please enter some words: " << std::flush; 
    std::getline(std::cin, line); 

    std::tr1::regex r("[ .,:;\\t\\n]+"); 
    std::tr1::regex w("[A-Za-z]+"); 

    std::cout << "Matching words:\n"; 
    std::copy(std::tr1::sregex_token_iterator(line.begin(), line.end(), w), 
     std::tr1::sregex_token_iterator(), 
     std::ostream_iterator<std::string>(std::cout, "\n")); 

    std::cout << "\nMatching separators:\n"; 
    std::copy(std::tr1::sregex_token_iterator(line.begin(), line.end(), r, -1), 
     std::tr1::sregex_token_iterator(), 
     std::ostream_iterator<std::string>(std::cout, "\n")); 

    return 0; 
} 

आप इसे इस प्रकार इनपुट देते हैं:: यहाँ दोनों का एक जल्दी डेमो है "यह कुछ 999 पाठ है", परिणाम इस तरह है:

Matching words: 
This 
is 
some 
text 

Matching separators: 
This 
is 
some 
999 
text 
+0

जैसा ही टिप्पणी है वह बूस्ट एक्सप्रेसिव (http://www.boost.org/doc/libs/1_42_0/doc/html/xpressive.html) का भी उपयोग कर सकता है जो उसे संकलित-समय त्रुटि जांच प्राप्त करेगा उनके नियमित अभिव्यक्तियां। मुझे संदेह है कि कभी भी मानक बन जाएगा :) – Manuel

+0

यह एक सबसे आदर्श आईएमओ है। लेकिन मैं वास्तव में इससे पहले भाग गया था और जिस सर्वर को मुझे निपटाया जाना है, उसका समर्थन नहीं करता है। :/ –

+0

@ मैनुअल: टिप्पणी मार्कडाउन सिंटैक्स कभी-कभी बेकार है, है ना? आप भी 1.38 का उपयोग कर रहे हैं ?! नवीनतम रिलीज संस्करण के लिए बूस्ट यूआरएल में '/ रिलीज /' का प्रयोग करें। –

0

पर्ल संगत नियमित अभिव्यक्ति के लिए (पिक/प्रीग), मैं boost.regex का सुझाव दूंगा।

0

इस छोटे से रंग ग्रेप उपकरण मैंने लिखा पर एक नजर है के लिए स्वतंत्र महसूस।

github

पर यह regcomp, regexec और regfree कि आर शमूएल Klatchko को संदर्भित करता है उपयोग करता है।

+0

क्या आपके पास उपसमूहों को वापस करने और उन्हें छेड़छाड़ करने का कोई उदाहरण है? –

+0

@ स्टैनिस्लाव Palatnik सोचो कि लाइन (लगभग) लाइन 95 पर संभाला जाता है – epatel