繁体   English   中英

Java正则表达式最长匹配

[英]Java regular expression longest match

我遇到了与以下形式的典型字符串匹配(类似)的通用正则表达式问题

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

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

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

问题是,Java没有给我提供四个不同的组,而是给了我一个,它合并了上面的四个,即我得到了一个字段:

field1" "field2" "field3" "field4

代替

field1
field2
field3
field4

我甚至尝试为每个字段执行\\“([^ \\”] *)\\“之类的操作,但结果是相同的。

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

您可以尝试将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

您要调用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM