2012-03-16 25 views
0

我想獲取列表中元素的位置和長度。因此,我想使用正則表達式分組,因爲我可以獲得匹配組的偏移量和長度。元素以逗號分隔,並且允許包含任何類型的字符。這裏有一個例子:使用Java正則表達式分組的掃描列表

(1234,A {}, 「富」)

這裏是我試圖做的:

String textToMatch = "(1234, A{}, \"foo\")"; 
Pattern p = Pattern.compile("\\(\\s*([^,]+?)(?:\\s*,\\s*([^,]+?)\\s*)*\\)"); 
Matcher m = p.matcher(textToMatch); 

if (m.find()) { 
    for (int i = 1; i <= m.groupCount(); i++) { 
     System.out.println(m.group(i)); 
    } 
} 

不幸的是,這是行不通的。我只得到第一個也是最後一個元素,但不是中間的元素。下面是上面顯示的輸出,我得到的代碼:

1234 
"foo" 

如果我使用相同的正則表達式的三倍,而不是使用星操作它的工作原理。我想我在迭代組中做了一些錯誤的事情。有任何想法嗎?

+0

我不知道Java的正則表達式非常好,但:有沒有你要我從1到任何理由低於等於groupCount(),而不是0到小於groupCount( )? – mfrankli 2012-03-16 22:08:25

+0

@mfrankli:組是基於1的,而不是基於0的。 (這在幾乎所有的正則表達式引擎中都是標準的。)在Java中,組0是一個僞組,它匹配整個匹配的子字符串。 – ruakh 2012-03-16 22:19:38

回答

1

而不是匹配整個字符串與find的單個調用,我認爲你應該創建一個匹配每個列表元素的正則表達式,然後遍歷這些匹配。例如:

// regex for any sequence of non-comma, non-parenthesis characters that 
// neither starts nor ends with whitespace: 
Pattern p = Pattern.compile("[^,\\s()](?:[^,()]*[^,\\s()])?"); 
Matcher m = p.matcher(textToMatch); 
while (m.find()) { 
    System.out.println(m.group()); // print entire matched substring 
}