正则表达式C

时间:2015-06-14 11:25:16

标签: 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);        
}

2 个答案:

答案 0 :(得分:1)

这里有两个问题:

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

    scanf("%50s", str_request);
    

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

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

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

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

  3. 参考

答案 1 :(得分:-1)

路径规范中的正则表达式中缺少字符。由于它以/开头,因此会出现匹配失败。 尝试将[a-z]替换为.+