c - Posix 正则表达式非贪婪

标签 c regex posix non-greedy

有没有一种方法可以像在 Perl 中那样在 C 中使用非贪婪正则表达式? 我尝试了几件事,但实际上没有用。

我目前正在使用这个与 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)

最佳答案

不,POSIX 正则表达式中没有非贪婪量词。但是有一个库为 C:http://www.pcre.org/ 提供类似 perl 的正则表达式。

关于c - Posix 正则表达式非贪婪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20239817/

相关文章:

调用 rename() 而不覆盖意外数据且不覆盖意外数据

pthread中两个线程之间的通信

c - GNU C 使用管道的多进程处理

c - 如何从 Windows .txt 文件中读取回车符(即 '\r' )

c - 检索库运行时

c - 将指针传递给函数不是在 C 中通过引用传递吗?

regex - 如何重写查询参数和重定向网站的 Varnish

java - 将 var^power 替换为 pow(var,power)

c - 堆栈缓冲区溢出导致的怪异执行路径

objective-c -\b 和\\b 在正则表达式中