正则表达式C中奇怪的空白字符行为

我在C中使用正则表达式时遇到问题。我想收集命令(GET,PUT或DEL)和文件路径,以便将正确的命令发送到服务器。

如果我只编译' [[:blank:]]*(GET|PUT|DEL|HELP) ' ,代码可以工作,我会收集正确的东西。 但是,当我向表达式添加内容时,例如: '[[:blank:]]*(GET|PUT|DEL|HELP)[[:blank:]]+([az])' ,regexec返回REG_NOMATCH 。

你有解决方案或者你知道为什么吗?

这是我的代码:

 #include  #include "dgb.h" #include  #include  #include  #include  DEFINE MODE "client" int main(int argc, char *argv[]) { regex_t preg; const char *str_regex = "[[:blank:]]*(GET|PUT|DEL|HELP)[[:blank:]]+([az])"; char str_request[51]; int reg_init; int reg_request; size_t nmatch = 0; regmatch_t *pmatch = NULL; reg_init = regcomp(&preg, str_regex, REG_ICASE); if (reg_init != 0) { printf("Error\n"); exit(EXIT_FAILURE); } nmatch = preg.re_nsub; pmatch = malloc(nmatch * sizeof(*pmatch)); checkmem(pmatch); while(strcmp(str_request,"quit") != 0) { printf(">>"); scanf("%50s", str_request); __fpurge(stdin); //fpurge on OSX reg_request = regexec(&preg, str_request, nmatch, pmatch, 0); if (reg_request == REG_NOMATCH) { printf("%s: Invalid command, please tap help\n", MODE); } else if (reg_request == 0) { char *cmd = NULL; int start = pmatch[0].rm_so; int end = pmatch[0].rm_eo; size_t size = end - start; cmd = malloc (sizeof (char*) * (size + 1)); strncpy(cmd, &str_request[start], size); cmd[size] = '\0'; printf ("%s\n", cmd); free(cmd); } } free(pmatch); } 

这里有两个问题:

  1. scanf中的格式字符串%s提取一个非空白字符的字符串,并在找到的第一个空白字符处停止。 当您输入GET somethingscanf行仅读取GET

     scanf("%50s", str_request); 

    一种选择是更改代码以使用fgets来读取整行输入。 请注意,新行字符包含在缓冲区中,因此您必须相应地处理它。

  2. 您正在使用扩展正则表达式(ERE)语法编写正则表达式,因为您正在使用交替| ,分组() ,一个或多个量词+

    在基本正则表达式(BRE)中, |+不可用,括号必须转义\( \)以调用其特殊含义。

    因此, REG_EXTENDED标志是必要的,以使您的正则表达式按预期工作。

参考

  • 正则表达式 – POSIX标准

路径规范中的正则表达式中缺少字符。 因为它以/你开始匹配失败。 尝试用.+替换[az]