在 C 语言中是否有像 Perl 中一样可以使用非贪婪正则表达式的方法呢?我尝试了几种方法,但实际上并没有起作用。
我目前正在使用这个匹配 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
c
,所以无法提供建议,但问题出在你的代码上而不是你的正则表达式。如果你在输入字符串的末尾添加更多内容,很可能会发现它并不匹配第二个HTTP/1.1
,而是返回整个输入字符串。 - OGHazagrep
进行测试,这样您可以重构问题以打击更广泛的“受众”。 - yeyo