在C中使用正则表达式时,\ d不起作用,但[0-9]不起作用

时间:2016-06-22 00:29:07

标签: c regex

我不明白为什么包含\d字符类的正则表达式模式不起作用,[0-9]却起作用。字符类,例如\s(空格字符)和\w(字符字符),可以正常工作。我的编译器是gcc(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3。我正在使用C正则表达式库。

为什么\d无效?

文字字符串:

const char *text = "148  apples    5 oranges";

对于上面的文本字符串,此正则表达式不匹配:

const char *rstr = "^\\d+\\s+\\w+\\s+\\d+\\s+\\w+$";

当使用[0-9]而不是\ d:

时,此正则表达式匹配
const char *rstr = "^[0-9]+\\s+\\w+\\s+[0-9]+\\s+\\w+$";



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

#define N_MATCHES  30

//   output from gcc --version: gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
//   compile command used:  gcc -o tstc_regex tstc_regex.c

const char *text = "148  apples    5 oranges";
  const char *rstr = "^[0-9]+\\s+\\w+\\s+[0-9]+\\s+\\w+$";    // finds match
//const char *rstr = "^\\d+\\s+\\w+\\s+\\d+\\s+\\w+$";        // does not find match

int main(int argc, char**argv)
{
    regex_t   rgx;
    regmatch_t   matches[N_MATCHES];
    int status;
    status = regcomp(&rgx, rstr, REG_EXTENDED | REG_NEWLINE);
    if (status != 0) {
        fprintf(stdout, "regcomp error: %d\n", status);
        return 1;
    }
    status = regexec(&rgx, text, N_MATCHES, matches, 0);
    if (status == REG_NOMATCH) {
        fprintf(stdout, "regexec result: REG_NOMATCH (%d)\n", status);
    }
    else if (status != 0) {
        fprintf(stdout, "regexec error: %d\n", status);
        return 1;
    }
    else {
        fprintf(stdout, "regexec match found: %d\n", status);
    }
    return 0;
}

4 个答案:

答案 0 :(得分:6)

你正在使用的正则表达式是GNU ERE,类似于POSIX ERE,但有一些额外的功能。其中包括对字符类缩写\s\S\w\W的支持,但不是 \d和{{ 1}}。您可以找到更多信息here

答案 1 :(得分:3)

在严格的POSIX环境中尝试任何一种模式可能最终没有匹配;如果你想使模式真正与POSIX兼容,请使用所有括号表达式:

const char *rstr = "^[[:digit:]]+[[:space:]]+[[:alpha:]]+[[:space:]]+[[:digit:]]+[[:space:]]+[[:alpha:]]+$";

POSIX Character_classes

答案 2 :(得分:1)

\ d是perl和vim字符类。

改为使用:

 const char *rstr = "^[[:digit:]]+\\s+\\w+\\s+[[:digit:]]+\\s+\\w+$"; 

答案 3 :(得分:0)

根据POSIX regular expression规范:

  

普通字符是受支持字符集中的任何字符,但ERE特殊字符中列出的ERE特殊字符除外。对反斜杠(&#39; \&#39;)前面的普通字符的解释是未定义的。

因此,合法关注\的唯一字符是:

\^    \.    \[    \$    \(    \)    \|
\*    \+    \?    \{    \\

所有这些都与字面上的转义字符匹配。尝试使用任何其他PCRE扩展程序可能无效。