我遇到一个问题,其中我的regexec代码返回的代码与Java代码不同。我使用了相同的正则表达式,但在c ++ / c中返回的结果不同。
这是我的代码段:
const char *pattern = "(%\\(.*?\\)|\\%[ds])";
if ((ret = regcomp(®Ex, pattern, REG_EXTENDED )) != 0)
printf ("%d error on regex..\n", ret);
while (1)
{
if(regexec(®Ex, 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(®Ex);
实际返回数据(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)%(d32)%(X8)
最佳答案
尝试凝视代码中的以下行,请等待一两分钟,以查看是否可以自己找出答案:
for (g = 0; g < 1; g++)
附言除了在for循环本身中增加
g
之外,您还需要在循环主体中也增加它。因此,由于多种原因,这将无法正常工作。