我正在尝试匹配字符串中的以下项目pcode:
u 后跟1或2位数字phaseuphasepx (被非单词字符包围)y (被非单词字符包围)z (被非单词字符包围)我尝试使用POSIX正则表达式函数实现正则表达式匹配(如下所示),但有两个问题:
我相信正则表达式字符串本身正在工作 - 它在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);
}
Run Code Online (Sandbox Code Playgroud)
Vil*_*ari 14
看来你打算使用类似于"扩展"POSIX正则表达式语法的东西.POSIX定义了两种不同的正则表达式语法,一种是"基本"(读"过时")语法和"扩展"语法.要使用扩展语法,您需要添加以下REG_EXTENDED标志regcomp:
...
if(regcomp(&compiled, pattern, REG_EXTENDED) == 0){
...
Run Code Online (Sandbox Code Playgroud)
如果没有此标志,regcomp将使用"基本"正则表达式语法.有一些重要的区别,例如:
|运营商\(并且\)还应该注意的是,POSIX扩展正则表达式语法与Python的正则表达式不兼容1:1(不了解TextMate).特别是,我担心你的regexp的这部分在POSIX中不起作用,或者至少不可移植:
[\\W]
Run Code Online (Sandbox Code Playgroud)
POSIX指定非空格字符的方式是:
[^[:space:]]
Run Code Online (Sandbox Code Playgroud)
你对POSIX的整个正则表达式应该在C中看起来像这样:
char *pattern = "((u[0-9]{1,2})|(phaseu)|(phasep)|[^[:space:]]+([xyz])[^[:space:]]+)";
Run Code Online (Sandbox Code Playgroud)