2011-06-24 149 views
0

我有一个通用的正则表达式匹配(在某种程度上)形式的一个典型的字符串问题Java正则表达式最长匹配

... "field1" "field2" "field3" "field4" ... 

我想要做的是,当然,让每一种字段分开。由于该字段可以包含任何字符,我现在用的形式

... \"(.*?)\" +\"(.*?)\" +\"(.*?)\" +\"(.*?)\" + ... 

的问题是不是产生4个不同的组,一个“包罗万象”正则表达式,爪哇给我一个,这是合并的4以上,即我得到单场:的

field1" "field2" "field3" "field4 

代替

field1 
field2 
field3 
field4 

我甚至试图做这样的事情\ “([^ \”] *)\”为每个字段,但结果是一样的

我怎么能分别得到这4个领域?

回答

1

matcher.find()每次通话将转移到下一场比赛:

String input = "... \"field1\" \"field2\" \"field3\" \"field4\" ..."; 
Matcher matcher = Pattern.compile("\"(.*?)\"").matcher(input); 
while (matcher.find()) 
    System.out.println(matcher.group(1)); 

,或者,如果你真的想捕获所有四位一体的比赛:

Matcher matcher = Pattern.compile("\"(.*?)\".*?\"(.*?)\".*?\"(.*?)\".*?\"(.*?)\".*?").matcher(input); 
if (matcher.find()) { 
    System.out.println(matcher.group(1)); 
    System.out.println(matcher.group(2)); 
    System.out.println(matcher.group(3)); 
    System.out.println(matcher.group(4)); 
} 

都产生相同的输出,这是:

field1 
field2 
field3 
field4 
1

你在调用matcher.group(1),matcher.group(2)等来获得单个匹配吗?默认方法返回整个匹配,即所有字段。

2

您可以尝试String.split这种输入的方法。

String input = "... \"field1\" \"field2\" \"field3\" \"field4\" ..."; 
    String[] split = input.split("\"\\s*\"?"); 
    String field1 = split[1]; // field1 
    String field2 = split[2]; // field2 
    String field3 = split[3]; // field3 
    String field4 = split[4]; // field4 
+0

split [x] - 索引从0开始。 – Nrj

+0

@Nrj:索引0可能具有空字符串或“field1”字符串的前缀。尝试并验证它。 –