我正在尝试匹配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.我忽略了什么?谢谢你的任何指示。
答案 0 :(得分:1)
你正在寻找的正则表达式是
#define NICK_PATTERN "^[]a-z0-9|{}^[]{4,36}$"
你要像这样编译它:
regcomp(&re, pattern, REG_ICASE | REG_EXTENDED | REG_NOSUB)
regcomp
,regexec
等使用POSIX正则表达式语法,这意味着略有不同的转义规则,没有用于匹配的斜杠,也没有像Perl中那样的标志 - 这些被替换,以某种方式通过功能和他们的旗帜来说话。这里有POSIX语法here的概要。它是为C ++接口编写的,但规则是相同的。
与您在此特定情况下的预期不同:您不必在[]
集合中逃脱,如果有]
成为该集合的一部分,它必须在前面。