2012-03-16 59 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 
}