无法匹配C中的正则表达式

时间:2017-01-19 11:00:41

标签: c regex

我在使用正则表达式时遇到问题:

 prefix:\w+,\w+,\s*-?[0-9]{1,4}\s*,\s*-?[0-9]{1,4}\s*,\s*-?[0-9]{1,4}\s*,(?:\w+)

匹配字符串如下:

prefix:string,string,-100,100,0,string

我在C代码中无法匹配此字符串。至少我在一些在线tool上获得了一个成功的匹配,我生成了这个正则表达式。还有关于" \"的汇编警告。正则表达式中的字符,所以我按照c-compiler-warning-unknown-escape-sequence-using-regex-for-c-program中的说明替换了它。编译警告修复后的正则表达式:

prefix:\\w+,\\w+,\\s*-?[0-9]{1,4}\\s*,\\s*-?[0-9]{1,4}\\s*,\\s*-?[0-9]{1,4}\\s*,(?:\\w+)

这是测试代码:

#include <stdio.h>
#include <regex.h>        
#include <stdlib.h>

#define REGEX "prefix:\\w+,\\w+,\\s*-?[0-9]{1,4}\\s*,\\s*-?[0-9]{1,4}\\s*,\\s*-?[0-9]{1,4}\\s*,(?:\\w+)"

const char *input = "prefix:string,string,-100,100,0,string";
int main(){

    int rc;

    regex_t regex;

    rc = regcomp(&regex, REGEX, 0);
    if (rc != 0) {
        fprintf(stderr, "Could not compile regex\n");
        exit(1);
    }

    rc = regexec(&regex, input, 0, NULL, 0);
    if (rc == 0) {
        printf("Match!\n");
        return 0;
    }
    else if (rc == REG_NOMATCH) {
        printf("No match\n");
        return -1;
    }
    else {
        perror("Error\n");
        exit(1);
    }

    return 0;
}

我使用gcc版本6.2.0 20161005(Ubuntu 6.2.0-5ubuntu12)

1 个答案:

答案 0 :(得分:3)

你需要做两件事:

  • 使用REG_EXTENDED标志来编译正则表达式(以便启用扩展的正则表达式(ERE)),否则限制量词将需要转义,并且可能存在其他潜在问题
  • 删除非捕获组(?:...),因为POSIX不支持此构造。
  • 要使\w+成为可选项,只需将(?:\w+)替换为\w*

使用

#define REGEX "prefix:\\w+,\\w+,\\s*-?[0-9]{1,4}\\s*,\\s*-?[0-9]{1,4}\\s*,\\s*-?[0-9]{1,4}\\s*,\\w*"
                                                                                                ^^^

然后

rc = regcomp(&regex, REGEX, REG_EXTENDED);
                            ^^^^^^^^^^^^

请参阅C demo

另外,请详细了解REG_EXTENDED启用的Extended Regular ExpressionsPOSIX Bracket Expressions也是了解BRE(基本正则表达式)和ERE风格之间差异的好资源。< / p>