我有以下正则表达式的问题:
prefix:\w+,\w+,\s*-?[0-9]{1,4}\s*,\s*-?[0-9]{1,4}\s*,\s*-?[0-9]{1,4}\s*,(?:\w+)
Run Code Online (Sandbox Code Playgroud)
匹配字符串如下:
prefix:string,string,-100,100,0,string
Run Code Online (Sandbox Code Playgroud)
我无法在我的 C 代码中匹配这个字符串。至少我在生成这个正则表达式的一些在线工具上获得了成功的匹配。还有关于正则表达式中“\”字符的编译警告,所以我按照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+)
Run Code Online (Sandbox Code Playgroud)
下面是测试代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我使用 gcc 版本 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12)
你需要做两件事:
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*"
^^^
Run Code Online (Sandbox Code Playgroud)
进而
rc = regcomp(®ex, REGEX, REG_EXTENDED);
^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
请参阅C 演示。
此外,请参阅有关由启用的扩展正则表达式的更多信息REG_EXTENDED,POSIX Bracket Expressions也是了解 BRE(基本正则表达式)和 ERE 风格之间差异的好资源。
| 归档时间: |
|
| 查看次数: |
1104 次 |
| 最近记录: |