正则表达式只匹配一次

时间:2018-05-12 14:10:40

标签: java regex string pattern-matching

我有以下只匹配一次的正则表达式:

Matcher m = Pattern.compile("POLYGON\\s\\(\\((([0-9]*\\.[0-9]+)\\s([0-9]*\\.[0-9]+),?)+\\)\\)")
                   .matcher("POLYGON ((12.789754538957263 36.12443963532555,12.778550292768816 36.089875458584984,12.77760353347314 36.12427601168043))");
while (m.find()) {
    System.out.println("-> " + m.group(2) + " - " + m.group(3));
}

但它只打印第一场比赛:

  

- > 12.789754538957263 - 36.12443963532555

为什么它与其他坐标不匹配?

我想为每对坐标打印一个新行,例如

12.789754538957263 - 36.12443963532555
12.778550292768816 - 36.089875458584984
12.77760353347314 - 36.12427601168043

2 个答案:

答案 0 :(得分:1)

您的正则表达式应如下(\[0-9\]*\.\[0-9\]+)\s(\[0-9\]*\.\[0-9\]+)

String input = ...
Matcher m = Pattern.compile("([0-9]*\\.[0-9]+)\\s([0-9]*\\.[0-9]+)").matcher(input);
while (m.find()) {
    System.out.println("-> " + m.group(1) + " - " + m.group(2));
}

输出

-> 12.789754538957263 - 36.12443963532555
-> 12.778550292768816 - 36.089875458584984
-> 12.77760353347314 - 36.12427601168043

如果您想确保输入应该在POLYGON (( .. ))之间,您可以使用replaceAll来提取输入:

12.789754538957263 36.12443963532555,12.778550292768816 36.089875458584984,12.77760353347314 36.12427601168043

您的代码应为:

.matcher(input.replaceAll("POLYGON \\(\\((.*?)\\)\\)", "$1"));

而不是:

.matcher(input);

解决方案2

在分析了你的问题后,我认为你需要这个:

Stream.of(input.replaceAll("POLYGON \\(\\((.*?)\\)\\)", "$1").split(","))
             .forEach(System.out::println);

答案 1 :(得分:0)

您仍然可以检查输入是否以某个字符串开头,如下所示。

我将使用以下正则表达式进行检查:(\[\\d.\]+)\\s(\[\\d.\]+)

它搜索由空格分隔的数字或点的序列。

String input = ...
if (input.startsWith("POLYGON")) {
    Matcher m = Pattern.compile("([\\d.]+)\\s([\\d.]+)").matcher(input);
    while (m.find()) {
        System.out.println("-> " + m.group(1) + " - " + m.group(2));
    }
}