这是我第一次在C语言中使用regex,我遇到了一些麻烦。我试图复制sed中使用的语法,即s/findthisstring/replacewiththis/g必须存在而findthisstring不存在的replacewiththis
我想到的正则表达式是^s/(.*)/(.*)/g$
这是我的密码

int verifyPattern(char *pattern) {
    regex_t regex;
    int reti = regcomp(&regex, "^s/(.*)/(.*)/g$", 0);

    if (reti) {
        fprintf(stderr, "Could not compile regex\n");
        exit(1);
    }

    reti = regexec(&regex, pattern, 0, NULL, 0);
    if (!reti) {
        puts("Match");
    } else if (reti == REG_NOMATCH) {
        puts("No match");
    } else {
        puts("Regex error");
    }

    return 1;
}

我相信搞错的部分是.+。如果我把它换成.*一切都好。有人知道这方面的工作吗??
谢谢!

最佳答案

您忘记传递REG_EXTENDED标志以允许模式中的$。另外,regex允许的/.../节太多。您需要的是匹配除/\之外的转义序列或字符:

int reti = regcomp(&regex, "^s/(\\\\.|[^\\\\/]+)+/(\\\\.|[^\\\\/]+)*/g$", REG_EXTENDED);

查看C demo
基本上,我用匹配转义序列(.)或((\\.|[^\\/]+))一个或多个字符而不是\\.|\模式替换了/
以下是测试列表:
verifyPattern("s/s/s/g");//Match
verifyPattern("s/s//g");//Match
verifyPattern("s//s/g");//No Match
verifyPattern("s/s\\/s/g");//No match
verifyPattern("s/s\\/s/text/text/text/g"); // No match

08-07 06:00