我遇到了一個問題,其中我的regexec代碼與我的Java代碼的返回方式不同。我使用了相同的正則表達式,但在C++/c中返回的方式不同。regexec沒有返回所有預期的匹配
這裏是我的代碼片段:
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)
這個Java怎麼樣? – fge
我的意思是,我有我的其他Java代碼中使用相同的正則表達式,但它工作正常。用我的C++代碼,它返回的方式不同。 –
那你能不能至少展示你使用的Java代碼? – fge