2016-08-09 8 views
6

में काम नहीं कर रहा है जब मैं इसे खोल पर उपयोग करता हूं तो यह regex का उपयोग कर रहा है लेकिन यह सी प्रोग्राम के अंदर नहीं है।रेगेक्स सी

कोई विचार कृपया?

echo "abc:[email protected]" | grep -E "(\babc\b|\bdef\b):[0-9]{10}@([A-Za-z0-9].*)" //shell 

reti = regcomp(&regex,"(\babc\b|\bdef\b):[0-9]{10}@([A-Za-z0-9].*)", 0); //c program 
+5

वाक्य-विन्यास को अनुकूलित 'ग्रेप -E' ERE वाक्य-विन्यास (मुझे लगता है कि यह ERE के करीब है, कुछ संवर्द्धन के साथ) का उपयोग करता है। 'Regcomp' पर 'REG_EXTENDED' ध्वज पास करें। फिर भी, मुझे यकीन नहीं है कि \ re' 'regex.h' द्वारा समर्थित है। –

+0

आपका सी संस्करण एक सी स्ट्रिंग के अंदर एकल बैकस्लाश का उपयोग करता है। यह काम नहीं करेगा, क्योंकि उन बैकस्लाश को आपकी रेगेक्स लाइब्रेरी में नहीं भेजा गया है। (कौन सा है?) – usr2564301

उत्तर

3

grep -E कुछ बढ़ाया ERE वाक्य-विन्यास जिसका अर्थ है कि {n,m} परिमाणक कोष्ठकों (और यह भी ( और )) भाग निकले किए जाने की जरूरत नहीं है (नहीं BRE regex में मामला) का उपयोग करता है।

चूंकि आप एक शब्द सीमा का उपयोग नहीं कर सकते हैं, की जगह पहले \b(^|[^[:alnum:]_]) के साथ "बराबर", regcomp को REG_EXTENDED ध्वज पारित करने के लिए, और भी जरूरत है।

const char *str_regex = "(^|[^[:alnum:]_])(abc|def):[0-9]{10}@([A-Za-z0-9].*)"; 

(^|[^[:alnum:]_]) भाग से मेल खाता है या तो स्ट्रिंग (^) या (|) एक चार अक्षरांकीय या अंडरस्कोर के अलावा अन्य की शुरुआत: आप कोई अनुगामी \b के बाद से वहाँ पैटर्न में एक : सही होने के बाद है की जरूरत है।

पूर्ण C demo:

#include <stdio.h> 
#include <stdlib.h> 
#include <regex.h> 

int main (void) 
{ 
    int match; 
    int err; 
    regex_t preg; 
    regmatch_t pmatch[4]; 
    size_t nmatch = 4; 
    const char *str_request = "abc:[email protected]"; 

    const char *str_regex = "(^|[^[:alnum:]_])(abc|def):[0-9]{10}@([A-Za-z0-9].*)"; 
    err = regcomp(&preg, str_regex, REG_EXTENDED); 
    if (err == 0) 
    { 
     match = regexec(&preg, str_request, nmatch, pmatch, 0); 
     nmatch = preg.re_nsub; 
     regfree(&preg); 
     if (match == 0) 
     { 
      printf("\"%.*s\"\n", pmatch[2].rm_eo - pmatch[2].rm_so, &str_request[pmatch[2].rm_so]); 
      printf("\"%.*s\"\n", pmatch[3].rm_eo - pmatch[3].rm_so, &str_request[pmatch[3].rm_so]); 
     } 
     else if (match == REG_NOMATCH) 
     { 
      printf("unmatch\n"); 
     } 
    } 
    return 0; 
} 
+0

प्लस 1. बहुत बहुत धन्यवाद विक्टर Stribiżew। इसने मेरी बहुत मदद की। निष्ठा से। – CppLearner

+0

ग्रेट।बस ध्यान रखें कि 'regmatch_t pmatch [4] 'और' size_t nmatch = 4' पैटर्न में परिभाषित कैप्चरिंग समूहों की संख्या पर निर्भर करता है: '4' = 1 +' (...) '* कैप्चरिंग * समूह की राशि। –

1

वर्ड सीमा संदर्भ

General
POSIX

ऊपर दिए गए लिंक से यह प्रतीत होता है POSIX यह खुद शब्द सीमा निर्माण है समर्थन करता है।
ध्यान दें कि ये [[:<:]], [[:>:]] कक्षाएं हैं।

यह देखते हुए कि, और ERE का उपयोग कर के रूप में BRE करने का विरोध किया है, तो आप ऐसा करने में सक्षम होना चाहिए - या

reti = regcomp(&regex,"[[:<:]](abc|def)[[:>:]]:[0-9]{10}@([A-Za-z0-9].*)", REG_EXTENDED);

, के बाद से [cf] और : के बीच एक प्राकृतिक शब्द सीमा है, यह करने के लिए कम किया जा सकता

reti = regcomp(&regex,"[[:<:]](abc|def):[0-9]{10}@([A-Za-z0-9].*)", REG_EXTENDED);

मैं इस परीक्षण नहीं किया लेकिन यह शायद काम करता है।
और यह देखते हुए कि इस आंतरिक रूप से, यह इस वाक्य रचना के साथ
छड़ी करने के लिए बेहतर हो सकता है है के रूप में वास्तव में स्पष्ट नहीं है।

कुछ इंजन, बूस्ट की तरह जो POSIX विकल्प होता है, \< और \>