我遇到一个问题,其中我的regexec代码返回的代码与Java代码不同。我使用了相同的正则表达式,但在c ++ / c中返回的结果不同。

这是我的代码段:

const char *pattern = "(%\\(.*?\\)|\\%[ds])";
if ((ret = regcomp(&regEx, pattern, REG_EXTENDED )) != 0)
    printf ("%d error on regex..\n", ret);

while (1)
{
    if(regexec(&regEx, cursor, maxGroups, grpArray, REG_NOTBOL)){
        break;  // No more matches
    }

    unsigned int g = 0;
    unsigned int offset = 0;
    for (g = 0; g < 1; g++)
    {
      if (grpArray[g].rm_so == (size_t)-1)
      {
        break;  // No more groups
      }

        char result[strlen(src) + 1];
        if (g == 0)
            offset = grpArray[g].rm_eo;
        char cursorCopy[strlen(cursor) + 1];
        strcpy(cursorCopy, cursor);
        cursorCopy[grpArray[g].rm_eo] = 0;
        parseFormatSpecifier(strResult);
        g++;
    }
    cursor += offset;
    //memset(&grpArray[0], 0, sizeof(grpArray));
}
regfree(&regEx);


实际返回数据(C / C ++):


结果:%(04up16)-%(02up8)-%(02up8)%(02up8):%(02up8)%(ip16)(0)
结果:%(04up16)-%(02up8)-%(02up8)%(02up8):%(02up8)%(ip16)(1)


预期的(Java):


结果:%(04up16)-%(02up8)-%(02up8)%(02up8):%(02up8)%(ip16)
结果:%(04up16)
结果:%(02up8)
结果:%(02up8)
结果:%(02up8)
结果:%(02up8)
结果:%(ip16)


将模式更改为:

        const char *pattern = (\\%\\(.*?\\)|\\%[ds]);


返回不同:


结果:%(04up16)-%(02up8)-%(02up8)%(02up8):%(02up8)%(ip16)-0
结果:%(04up16)-%(02up8)-%(02up8)%(02up8):%(02up8)%(ip16)-1


顺便说一句,在Java中同时使用两种模式/正则表达式都很好。表示它正确返回所有匹配项。我的正则表达式有问题吗?任何人都可以帮助我如何为posix构造正则表达式以达到以下预期结果? %后面应带有'(',然后是任何字符,并以')'结束,或者%应该后面带有's'或'd'。

正则表达式可以接受的示例:


%d%s%(02up8)%(ip16)%(d3​​2)%(X8)

最佳答案

尝试凝视代码中的以下行,请等待一两分钟,以查看是否可以自己找出答案:

for (g = 0; g < 1; g++)


附言除了在for循环本身中增加g之外,您还需要在循环主体中也增加它。因此,由于多种原因,这将无法正常工作。

10-07 23:35