【问题标题】:Regex to split coordinates string Java正则表达式拆分坐标字符串Java
【发布时间】:2021-06-17 09:47:30
【问题描述】:

我有以下字符串:

["lat\/lng: (49.47491213070514,-1.2361999005079265)","lat\/lng (42.478589638625664,-1.226332724094391)"]

我想使用正则表达式拆分它,以便我可以将 latLng 数据输入到数组中。

是否有一个表达式可以让我抓取括号之间的数据?

【问题讨论】:

  • 不要使用正则表达式解析 JSON,使用 JSON 解析器。对于必须维护代码的人来说,这将更容易维护并且不会造成混淆。

标签: java arrays regex arraylist coordinates


【解决方案1】:
\(([\.\-0-9]+)\,([\.\-0-9]+)\)

当单独对该数组中的每个字符串执行时,将为您返回具有这些值分隔的匹配组。不过我不知道如何用Java实现!

【讨论】:

  • 感谢您的回答,这似乎抓住了除了括号之间的内容之外的所有内容?
  • 我误解了您会将数组作为字符串处理,而不是数组。无论如何,其他人在完整代码中为您提供了更有用的东西! :-)
【解决方案2】:

您可以使用正则表达式(?<=\()[^)]*(?=\))

演示:

import java.util.Arrays;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;

public class Main {
    public static void main(String args[]) {
        // Test
        String str = "[\"lat\\/lng: (49.47491213070514,-1.2361999005079265)\",\"lat\\/lng (42.478589638625664,-1.226332724094391)\"]";

        String[][] arr = Pattern.compile("(?<=\\()[^)]*(?=\\))")
                                .matcher(str)
                                .results()
                                .map(MatchResult::group)
                                .map(s -> s.split(","))
                                .toArray(String[][]::new);

        System.out.println(Arrays.deepToString(arr));
    }
}

输出:

[[49.47491213070514, -1.2361999005079265], [42.478589638625664, -1.226332724094391]]

ONLINE DEMO

非流解决方案:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String args[]) {
        // Test
        String str = "[\"lat\\/lng: (49.47491213070514,-1.2361999005079265)\",\"lat\\/lng (42.478589638625664,-1.226332724094391)\"]";

        Matcher matcher = Pattern.compile("(?<=\\()[^)]*(?=\\))").matcher(str);

        List<String[]> list = new ArrayList<>();

        while (matcher.find()) {
            list.add(matcher.group().split(","));
        }

        String[][] arr = list.toArray(new String[0][0]);

        System.out.println(Arrays.deepToString(arr));
    }
}

ONLINE DEMO

regex101 正则表达式的解释:

【讨论】:

  • 感谢您的详细回复!不过,我似乎遇到了一些错误,1:无法解析匹配器中的方法结果 2:对组的引用不明确,可能是 group() 或 group(int) 编辑第三个错误:无法解析方法拆分( Java.lang.string)
  • @Jonwil - 您的 JDK 版本可能低于 9。Matcher#result 是在 Java9 中添加的。无论如何,我刚刚添加了一个非 Stream 解决方案。如果有任何进一步的疑问/问题,请随时发表评论。
【解决方案3】:

Java 正则表达式支持捕获组 ( ) ...

假设@somewhatsapient 提供的模式是正确的:

Pattern pattern = Pattern.compile("\(([\.\-0-9]+)\,([\.\-0-9]+)\)");
Matcher m = pattern.matcher(inputString);
if(m.matches()) {
    System.out.println(m.group(1));
    System.out.println(m.group(2));
}

由于它提供了所要求的内容,因此可以节省映射和完全拆分结果的时间。
并且在施放它时……那是double(可用)而不是String(无用);例如:

new LatLng(Double.parseDouble(m.group(1)), Double.parseDouble(m.group(2)))

正则表达式甚至可能不是最优雅的方式 - 因为可以使用 GSON 转换器自动映射 ArrayList&lt;LatLng&gt;

【讨论】:

  • 第一行会导致编译错误。 Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
【解决方案4】:

删除头部和尾部,然后拆分术语之间的内容。

String[] latLngs = str.replaceAll("^.*\\(|\\).*$", "").split("\\).*?\\(");

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多