正则表达式无法按预期工作

时间:2014-12-08 21:45:42

标签: c regex

我正在尝试匹配C中的有效昵称。

我有以下功能:

int check_valid_nickname(char *nick) {
    if(!match(nick,NICK_PATTERN)) {
        return 0;
    } else {
}

int match(char *str, char *pattern) {
    int    status;
    regex_t re;
    if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
        /* Report error. */
        return 0;
    }
    status = regexec(&re, str, (size_t) 0, NULL, 0);
    regfree(&re);
    if (status != 0) {
        /* Report error. */
        return 0;
    }
    return 1;
}

和NICK_PATTERN定义为

#define NICK_PATTERN "/^[a-z0-9_\\|\\{\\}\\[\\]\\^]{4,36}$/i"

我在regexr上测试了模式,它完全符合我的需要。

然而,我在C中的功能仍然总是返回0.我忽略了什么?谢谢你的任何指示。

1 个答案:

答案 0 :(得分:1)

你正在寻找的正则表达式是

#define NICK_PATTERN "^[]a-z0-9|{}^[]{4,36}$"

你要像这样编译它:

regcomp(&re, pattern, REG_ICASE | REG_EXTENDED | REG_NOSUB)

regcompregexec等使用POSIX正则表达式语法,这意味着略有不同的转义规则,没有用于匹配的斜杠,也没有像Perl中那样的标志 - 这些被替换,以某种方式通过功能和他们的旗帜来说话。这里有POSIX语法here的概要。它是为C ++接口编写的,但规则是相同的。

与您在此特定情况下的预期不同:您不必在[]集合中逃脱,如果有]成为该集合的一部分,它必须在前面。