Java正则表达式最长匹配

时间:2011-06-24 02:40:35

标签: java regex

我遇到了一个普通正则表达式的问题,它匹配(排序)表格的典型字符串

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

我想要做的当然是分别获取每个字段。因为字段可以包含任何字符,所以我使用的形式是“全部”正则表达式

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

问题是,Java不是生成4个不同的组,而是只给我一个,它合并了上面的4个,即我得到一个字段:

field1" "field2" "field3" "field4

而不是

field1
field2
field3
field4

我甚至尝试过为每个字段做过“([^ \”] *)\“,但结果是一样的。

我怎么能分别得到这4个字段?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您是否正在调用matcher.group(1),matcher.group(2)等来获取个别匹配?默认方法返回整个匹配,即所有字段。

答案 2 :(得分: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