C regcomp 不编译模式

C regcomp doesn't compile pattern

我想将 base64 字符串与此 ^(?=(.{4})*$)[A-Za-z0-9+/]*={0,2}$ 模式匹配。我尝试过不同的模式、标志和其他语言。我无法使用 openssl 之外的第三方库。

#include <stdio.h>
#include <regex.h>

int main()
{
    const char *data = "dGVzdHRlc3Q=";
    regex_t regex;

    int ret = regcomp(&regex, "^(?=(.{4})*$)[A-Za-z0-9+/]*={0,2}$", REG_EXTENDED);
    if (ret)
    {
        printf("Could not compile regex\n");
        return 1;
    }

    ret = regexec(&regex, data, 0, NULL, 0);
    if (!ret)
        printf("Match\n");
    else if (ret == REG_NOMATCH)
        printf("No match\n");

    regfree(&regex);
    return 0;
}

您可以重写正则表达式而不用 POSIX 正则表达式风格不支持的前瞻性。该环视确保字符串由零次或多次出现的任意四个字符组成。通过使用

int ret = regcomp(&regex, "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$", REG_EXTENDED);

你们匹配了相同的字符串。参见C demo online详情:

  • ^ - 字符串开头
  • ([A-Za-z0-9+/]{4})* - 四个 ASCII 字母、数字、+/ 字符出现零次或多次
  • ([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)? - 可选出现四个 ASCII letters/digits///+,或三个 ASCII letters/digits/// + 然后是单个 = 字符,或者 ASCII letters/digits///+ 然后是两个 = 字符
  • $ - 字符串结尾。