我在C中使用正则表达式时遇到问题 我想收集一个命令(GET,PUT或DEL)和一个文件路径,以便将正确的命令发送到服务器。
如果我只编译' [[:blank:]]*(GET|PUT|DEL|HELP) '
,代码可以正常工作,我会收集正确的东西。但是,当我向表达式添加内容时,例如:'[[:blank:]]*(GET|PUT|DEL|HELP)[[:blank:]]+([a-z])'
,regexec将返回REG_NOMATCH。
你有解决方案或者你知道为什么吗?
这是我的代码:
#include <regex.h>
#include "dgb.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <stdio_ext.h>
DEFINE MODE "client"
int main(int argc, char *argv[]) {
regex_t preg;
const char *str_regex = "[[:blank:]]*(GET|PUT|DEL|HELP)[[:blank:]]+([a-z])";
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);
}
答案 0 :(得分:1)
这里有两个问题:
%s
中的格式字符串scanf
提取一串非空白字符,并在找到的第一个空白字符处停止。当您输入GET something
时,GET
行只能读取scanf
。
scanf("%50s", str_request);
一种选择是更改代码以使用fgets
来读取整行输入。请注意,新行字符包含在缓冲区中,因此您必须相应地处理它。
您正在使用扩展正则表达式(ERE)语法编写正则表达式,因为您正在使用交替|
,将(
和)
分组,一个或多个量词{{ 1}}。
在基本正则表达式(BRE)中,+
和|
不可用,并且括号必须转义+
\(
才能调用其特殊含义。
因此,\)
标记是必要的,以使您的正则表达式按预期工作。
答案 1 :(得分:-1)
路径规范中的正则表达式中缺少字符。由于它以/
开头,因此会出现匹配失败。
尝试将[a-z]
替换为.+