Java正则表达式最长匹配

Java正则表达式最长匹配,java,regex,Java,Regex,我对匹配(某种程度上)表单的典型字符串的泛型正则表达式有问题 ... "field1" "field2" "field3" "field4" ... ... \"(.*?)\" +\"(.*?)\" +\"(.*?)\" +\"(.*?)\" + ... 当然,我想做的是分别获取这些字段。因为字段可以包含任何字符,所以我使用的是表单的“catch all”正则表达式 ... "field1" "field2" "field3" "field4" ... ... \"(.*?)\" +\"(

我对匹配(某种程度上)表单的典型字符串的泛型正则表达式有问题

... "field1" "field2" "field3" "field4" ...
... \"(.*?)\" +\"(.*?)\" +\"(.*?)\" +\"(.*?)\" + ...
当然,我想做的是分别获取这些字段。因为字段可以包含任何字符,所以我使用的是表单的“catch all”正则表达式

... "field1" "field2" "field3" "field4" ...
... \"(.*?)\" +\"(.*?)\" +\"(.*?)\" +\"(.*?)\" + ...
问题是,Java没有生成4个不同的组,而是只提供了一个组,它合并了上述4个组,即我得到一个字段:

field1" "field2" "field3" "field4
而不是

field1
field2
field3
field4
我甚至尝试过对每个字段执行\“([^\“]*)\”之类的操作,但结果是一样的


如何分别获取这4个字段?

是否调用matcher.group(1)、matcher.group(2)等来获取单个匹配项?默认方法返回所有字段的整个匹配项。

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

每次调用
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

每次调用
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

对于此类输入,您可以尝试
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

对于此类输入,您可以尝试
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

拆分[x]--索引以0开头。@Nrj:索引0可能有空字符串或前缀“field1”字符串。请尝试验证。拆分[x]--索引以0开头。@Nrj:索引0可能有空字符串或前缀“field1”字符串。请尝试验证。