我遇到了以下正则表达式的问题:
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代码中无法匹配此字符串。至少我在一些在线工具上使用生成的正则表达式成功匹配。还有编译警告关于正则表达式中的"\"字符,所以我按照C编译器警告-未知转义序列使用正则表达式进行C程序中的解释进行了替换。编译警告修复后的正则表达式:
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(®ex, REGEX, 0);
if (rc != 0) {
fprintf(stderr, "Could not compile regex\n");
exit(1);
}
rc = regexec(®ex, 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)
REG_EXTENDED
: “模式的默认正则表达式类型是基本正则表达式。应用程序可以使用REG_EXTENDED cflags标志指定扩展正则表达式。”(http://pubs.opengroup.org/onlinepubs/009695399/functions/regcomp.html) - JongwareREG_EXTENDED
。在BRE中,{n,m}
应该被转义。我认为应该删除(?:)
。请参见此C演示,返回Match
。 - Wiktor Stribiżew.{4}
和输入aaaa
也无法匹配。我正在查看手册页面,表面上看起来你的代码没有问题... - Qix - MONICA WAS MISTREATED(
替换(?:
可以解决问题。我没有提到最后一个字符串是可选的,所以正则表达式也不同。此外,需要使用 REG_EXTENDED 才能使其正常工作。 - pbn