2012-12-09 77 views
1

下面是這種情況,我有這樣的正則表達式:正則表達式在java中不斷丟失數據

\"category\",([0-9]+)\n(\"subcategory\",[0-9]+\n)* 

這種模式應符合以下數據:

"category",1 
"subcategory",1 
"subcategory",2 
"subcategory",3 
"category",2 
"subcategory",1 
"subcategory",2 
"subcategory",3 

,我用下面正則表達式功能:

public static List<String> regexFindMultiStrings(String pattern, String input) { 
    Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE); 
    Matcher m = p.matcher(input); 
    List<String> data = new ArrayList<String>() ; 

    while (m.find()) 
    { 

     for (int i = 0; i <= m.groupCount(); i++) 
     { 
      data.add(m.group(i)); 
      //Log.e("Array", m.group(i)); 
     } 
    } 
    return data; 
} 

這裏的問題是,現在,當我用這個模式來匹配所有的數據也只給出如下荷蘭國際集團:

1 
"subcategory",1 
2 
"subcategory",1 

這是一件好事,我不是在尋找如何讓所有的數據是這樣的:

1 
"subcategory",1 
"subcategory",2 
"subcategory",3 
2 
"subcategory",1 
"subcategory",2 
"subcategory",3 
+0

同樣的事情,問題是如果我使用regexpal或任何其他正則表達式工具我得到的所有字符串匹配,但與Java我只是讓主類別和第一個子類別。它的一個奇怪的行爲:\ – SolidSnake

+0

請參閱http://stackoverflow.com/questions/5018487/regular-expression-with-variable-number-of-groups – Mat

回答

3

你缺少一對括號:

\"category\",([0-9]+)\n((\"subcategory\",[0-9]+\n)*) 

問題在於,您無法期望獲得同一組的多個匹配的捕獲。

可選可以使內組非捕獲:

\"category\",([0-9]+)\n((?:\"subcategory\",[0-9]+\n)*) 
+0

@感謝編輯 – CAFxX

+0

仍然我得到了相同的結果: \ – SolidSnake

+0

您的for循環應以'i = 1'開始而不是0.請使用\ \ category \ \,(\\ d +)\ n((\「subcategory \」,\\ d + \ n)*)'嘗試。 –