我有以下只匹配一次的正则表达式:
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
答案 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);
在分析了你的问题后,我认为你需要这个:
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));
}
}