regexec没有返回所有预期的比赛

时间:2015-11-14 13:17:38

标签: java c++ c regex posix

我遇到了一个问题,其中我的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)

1 个答案:

答案 0 :(得分:0)

尝试盯着代码中的以下一两分钟,看看你是否能自己找出答案:

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

P.S。除了在for循环中递增g之外,您还可以在循环体中递增它。所以,由于几个原因,这不会起作用。