gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:13:27 35 4
gpt4 key购买 nike

我在 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);
}

最佳答案

这里有两个问题:

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

    scanf("%50s", str_request);

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

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

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

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

引用

关于c - 正则表达式 C 中奇怪的空白字符行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828786/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com