有没有一种方法可以在C中使用非贪婪的正则表达式,就像在Perl中可以使用的那样? 我尝试了几件事,但实际上并不奏效。posix正则表达式非贪婪
我目前使用此正则表达式匹配的IP地址和相应的HTTP请求,但尽管我使用的是*?:
([0-9]{1,3}(\\.[0-9]{1,3}){3})(.*?)HTTP/1.1
在这个例子中,它总是相匹配的贪婪整个字符串:
#include <regex.h>
#include <stdio.h>
int main() {
int a, i;
regex_t re;
regmatch_t pm;
char *mpages = "TEST 127.0.0.1 GET /test.php HTTP/1.1\" 404 525 \"-\" \"Mozilla/5.0 (Windows NT HTTP/1.1 TEST";
a = regcomp(&re, "([0-9]{1,3}(\\.[0-9]{1,3}){3})(.*?)HTTP/1.1", REG_EXTENDED);
if(a!=0)
printf(" -> Error: Invalid Regex");
a = regexec(&re, &mpages[0], 1, &pm, REG_EXTENDED);
if(a==0) {
for(i = pm.rm_so; i < pm.rm_eo; i++)
printf("%c", mpages[i]);
printf("\n");
}
return 0;
}
$ ./regtest
127.0.0.1 GET /test.php HTTP/1.1" 404 525 “ - ”“Mozilla的/ 5.0(Windows NT的HTTP/1.1
您可以将输入的字符串添加到该问题。 [它似乎为我工作。](http://regexr.com?37cvn) – OGHaza
我不知道'c'所以不能建议,但问题是在你的代码[不是你的正则表达式](http: //regexr.com?37cvt)。如果您在输入字符串的末尾添加更多内容,可能会明显看出它不匹配第二个“HTTP/1.1”,而是返回整个输入字符串。 – OGHaza
您可以使用更准确的IP匹配。检查这个答案:http://stackoverflow.com/a/106223/363573 – Stephan