我想要匹配的以下各项的字符串 pcode:

  • u 跟1或2位数字的号码
  • phaseu
  • phasep
  • x (四周的非词chars)
  • y (四周的非词chars)
  • z (四周的非词chars)

我已经试图实现一个regex匹配使用POSIX regex职能(以下所示),但有两个问题:

  1. 该汇编的模式似乎没有子模式(即编制。n_sub==0).
  2. 该模式没有找到匹配的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:]]+)";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top