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

标签 c regex

我在 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/

相关文章:

java正则表达式部分替换

c - 代码中的 dbx WUA 错误跟踪

c - 在 yacc 中处理 block

regex - 删除特定的重复行而不进行排序

正则表达式获取组内匹配

Python 正则表达式陷阱

c++ - 如何从文件“HANDLE”中获取一个“HANDLE”到包含目录?

c - 如何使用掩码获取几位的值

c - 为什么 fun(int *p) 不改变指针的值?

Python 使用正则表达式对相似模式进行分组