编译/匹配POSIX Regular Expressions在C
题
我想要匹配的以下各项的字符串 pcode
:
u
跟1或2位数字的号码phaseu
phasep
x
(四周的非词chars)y
(四周的非词chars)z
(四周的非词chars)
我已经试图实现一个regex匹配使用POSIX regex职能(以下所示),但有两个问题:
- 该汇编的模式似乎没有子模式(即编制。n_sub==0).
- 该模式没有找到匹配的string"u0",则应该真正地!
我相信,regex串本身的工作,它的工作原理在python和突的—我的问题在于汇编,等等。C.任何帮助获得工作,将不胜感激。
在此先感谢您的答案。
if(idata=tb_find(deftb,pdata)){
MESSAGE("Global variable!\n");
char pattern[80] = "((u[0-9]{1,2})|(phaseu)|(phasep)|[\\W]+([xyz])[\\W]+)";
MESSAGE("Pattern = \"%s\"\n",pattern);
regex_t compiled;
if(regcomp(&compiled, pattern, 0) == 0){
MESSAGE("Compiled regular expression \"%s\".\n", pattern);
}
int nsub = compiled.re_nsub;
MESSAGE("nsub = %d.\n",nsub);
regmatch_t matchptr[nsub];
int err;
if(err = regexec (&compiled, pcode, nsub, matchptr, 0)){
if(err == REG_NOMATCH){
MESSAGE("Regular expression did not match.\n");
}else if(err == REG_ESPACE){
MESSAGE("Ran out of memory.\n");
}
}
regfree(&compiled);
}
解决方案
你似乎打算使用类似的东西的"扩展"POSIX regex syntax.POSIX定了两种不同的regex语法,一个"基本"(阅读"过时")的语法和"扩展"的语法。使用扩展的语法,你需要添加的 REG_EXTENDED
标志 regcomp
:
...
if(regcomp(&compiled, pattern, REG_EXTENDED) == 0){
...
没有这个标志、一将使用"基本"regex syntax.有一些重要的差异,例如:
- 不支持
|
操作员 - 括号内为子匹配项需要逃了出来,
\(
和\)
还应该指出, POSIX extended regex syntax不是1:1兼容Python regex (不知道关于突).特别是,我恐怕这一部分的你的regexp不工作POSIX,或者至少不是便携式:
[\\W]
POSIX的方式指定非空间字是:
[^[:space:]]
你的整个regexp POSIX应该再看看像这样C:
char *pattern = "((u[0-9]{1,2})|(phaseu)|(phasep)|[^[:space:]]+([xyz])[^[:space:]]+)";
不隶属于 StackOverflow