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
相关产品推荐
相关产品推荐

