regexec不排除字符

问题描述

我正在尝试匹配其中没有字母'd'的单词,但是regexec仍然匹配带有字母d的单词

int main(void) {
    regex_t regex;
    char *str = "dabcd";
    char *pattern = "[^d]*";
    
    int ret;

    ret = regcomp(&regex,pattern,0);
    if (ret == 0) {
        printf("regex compilation successfully\n");
    } else {
        printf("regex compilation unsuccessful\n");
    }

    ret = regexec(&regex,str,NULL,0);
    if (ret == 0) {
        printf("there is a match\n");
    } else {
        printf("there is no match : %d\n",ret);

    }

    return 0;
}

如何解决呢?我的正则表达式有问题吗?

解决方法

您的表达式仅检查在字符串中的某个点上是否存在一系列零个或多个非d字符。如果您希望整个过程都匹配:

^[^d]*$

在字符串开头转换为的位置,零个或多个非d字符后跟字符串的结尾

这将需要更改您的编译代码:

ret = regcomp(&regex,pattern,REG_EXTENDED);

标记为in the documentation的地方:

解释正则表达式时,请使用POSIX扩展正则表达式语法。如果未设置,则使用POSIX基本正则表达式语法。

man pages for BSD express更好:

编译现代(“扩展”)RE,而不是默认的过时(“基本”)RE。

因此默认情况下使用该模式。

提示:要调试正则表达式,请使用诸如Regex101之类的解释器工具。