我正在尝试匹配字符串中的以下项目pcode
:
-
u
后跟 1 或 2 位数字
phaseu
phasep
-
x
(被非单词字符包围)
-
y
(被非单词字符包围)
-
z
(被非单词字符包围)
我尝试使用 POSIX 正则表达式函数(如下所示)实现正则表达式匹配,但有两个问题:
- 编译后的模式似乎没有子模式(即compiled.n_sub == 0)。
- 该模式在字符串“u0”中没有找到匹配项,而它确实应该找到匹配项!
我相信正则表达式字符串本身可以工作——因为它可以在 python 和 TextMate 中工作——我的问题在于 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 正则表达式语法的东西。 POSIX 定义了两种不同的正则表达式语法,“基本”(读为“过时”)语法和“扩展”语法。要使用扩展语法,您需要添加REG_EXTENDED
标记为regcomp
:
...
if(regcomp(&compiled, pattern, REG_EXTENDED) == 0){
...
如果没有此标志,regcomp 将使用“基本”正则表达式语法。有一些重要的区别,例如:
- 不支持
|
操作员
- 子匹配的括号需要转义,
\(
and \)
还应该指出的是POSIX 扩展正则表达式语法与 Python 正则表达式不是 1:1 兼容(不知道 TextMate)。特别是,我担心您的正则表达式的这一部分在 POSIX 中不起作用,或者至少不可移植:
[\\W]
指定非空格字符的 POSIX 方法是:
[^[:space:]]
POSIX 的整个正则表达式在 C 中应该如下所示:
char *pattern = "((u[0-9]{1,2})|(phaseu)|(phasep)|[^[:space:]]+([xyz])[^[:space:]]+)";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)