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;
}
स्रोत
2016-08-09 10:21:40
वाक्य-विन्यास को अनुकूलित 'ग्रेप -E' ERE वाक्य-विन्यास (मुझे लगता है कि यह ERE के करीब है, कुछ संवर्द्धन के साथ) का उपयोग करता है। 'Regcomp' पर 'REG_EXTENDED' ध्वज पास करें। फिर भी, मुझे यकीन नहीं है कि \ re' 'regex.h' द्वारा समर्थित है। –
आपका सी संस्करण एक सी स्ट्रिंग के अंदर एकल बैकस्लाश का उपयोग करता है। यह काम नहीं करेगा, क्योंकि उन बैकस्लाश को आपकी रेगेक्स लाइब्रेरी में नहीं भेजा गया है। (कौन सा है?) – usr2564301