我不明白为什么包含\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;
}
答案 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:]]+$";
答案 2 :(得分:1)
\ d是perl和vim字符类。
改为使用:
const char *rstr = "^[[:digit:]]+\\s+\\w+\\s+[[:digit:]]+\\s+\\w+$";
答案 3 :(得分:0)
普通字符是受支持字符集中的任何字符,但ERE特殊字符中列出的ERE特殊字符除外。对反斜杠(&#39; \&#39;)前面的普通字符的解释是未定义的。
因此,合法关注\
的唯一字符是:
\^ \. \[ \$ \( \) \|
\* \+ \? \{ \\
所有这些都与字面上的转义字符匹配。尝试使用任何其他PCRE扩展程序可能无效。