You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java从POLYGON字符串提取坐标:replaceAll正则失效问题排查

提取POLYGON字符串中坐标的问题解决

咱们先聊聊你遇到的问题:你想用replaceAll提取POLYGON包裹的坐标,但写的正则没起作用,结果还是原字符串。这是因为你的正则表达式完全匹配不上目标字符串的结构,咱们一步步拆解问题,再给你靠谱的解决方法。

你的正则为什么失效?

你写的正则是\\D\\(\\(\\w\\)\\),这里有几个明显的问题:

  • \\D只匹配单个非数字字符,但你的字符串开头是POLYGON((,这是一串字母加括号,不是单个字符,根本匹配不上
  • \\w匹配的是字母、数字或下划线,但坐标部分是数字、小数点、空格和逗号,完全不符合这个规则
  • 你用了$2作为替换内容,但你的正则里根本没有定义第二个分组(连第一个分组都没写),所以这个引用是无效的

简单说,这个正则和你的目标字符串结构完全不搭,自然不会有任何替换效果。

两种正确的实现方式

方式一:直接替换首尾的无关内容

最直接的思路就是把开头的POLYGON((和结尾的))替换成空字符串,代码如下:

String str = "POLYGON((39.4189453125 37.418708616699824,42.0556640625 37.418708616699824,43.4619140625 34.79181436843146,38.84765625 33.84817790215085,39.4189453125 37.418708616699824))";
final String coordsOnly = str.replaceAll("^POLYGON\\(\\(|\\)\\)$", "");
System.out.println(coordsOnly);

这里的正则解释:

  • ^POLYGON\\(\\(:^表示字符串开头,精准匹配开头的POLYGON((
  • \\)\\)$:$表示字符串结尾,精准匹配结尾的))
  • 用空字符串替换这两部分,就能得到中间的坐标内容

方式二:用分组捕获坐标内容

如果想更严谨地提取(比如担心字符串里有其他多余括号的情况),可以用正则分组来捕获中间的坐标:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String str = "POLYGON((39.4189453125 37.418708616699824,42.0556640625 37.418708616699824,43.4619140625 34.79181436843146,38.84765625 33.84817790215085,39.4189453125 37.418708616699824))";
        Pattern pattern = Pattern.compile("POLYGON\\(\\((.*?)\\)\\)");
        Matcher matcher = pattern.matcher(str);
        if (matcher.find()) {
            String coordsOnly = matcher.group(1);
            System.out.println(coordsOnly);
        }
    }
}

这个方法的核心是(.*?)这个非贪婪分组,它会精准捕获((和))之间的所有内容,不会多也不会少。调用matcher.group(1)就能拿到这个分组里的坐标字符串。

内容的提问来源于stack exchange,提问作者Elad Benda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:03:13