2015-11-14 91 views
0

我遇到了一個問題,其中我的regexec代碼與我的Java代碼的返回方式不同。我使用了相同的正則表達式,但在C++/c中返回的方式不同。regexec沒有返回所有預期的匹配

這裏是我的代碼片段:

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)%(D32)%(X8)
+0

這個Java怎麼樣? – fge

+0

我的意思是,我有我的其他Java代碼中使用相同的正則表達式,但它工作正常。用我的C++代碼,它返回的方式不同。 –

+0

那你能不能至少展示你使用的Java代碼? – fge

回答

0

嘗試在盯着:

實施例由正則表達式所接受在你的代碼中輸入一行或兩行,看看你能否自己找出答案:

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

PS除了在for循環本身中增加g之外,您還可以在循環體中增加它。所以,這不會有幾個原因。

+0

我的不好,這是一個錯字。額外的g ++應該被刪除。 –