正则表达式分割嵌套的坐标字符串

Hum*_*art 10 java regex

我有一个格式的字符串"[(1, 2), (2, 3), (3, 4)]",具有任意数量的元素.我想将它拆分的逗号分隔的坐标,也就是检索(1, 2),(2, 3)(3, 4).

我可以用Java正则表达式吗?我是一个完整的菜鸟,但希望Java正则表达式足够强大.如果不是,你能建议一个替代方案吗?

Hub*_*ert 9

来自Java 5

Scanner sc = new Scanner();
sc.useDelimiter("\\D+"); // skip everything that is not a digit
List<Coord> result = new ArrayList<Coord>();
while (sc.hasNextInt()) {
    result.add(new Coord(sc.nextInt(), sc.nextInt()));
}
return result;
Run Code Online (Sandbox Code Playgroud)

编辑:我们不知道字符串中传递了多少坐标coords.


Bal*_*usC 7

你可以用String#split()它.

String string = "[(1, 2), (2, 3), (3, 4)]";
string = string.substring(1, string.length() - 1); // Get rid of braces.
String[] parts = string.split("(?<=\\))(,\\s*)(?=\\()");
for (String part : parts) {
    part = part.substring(1, part.length() - 1); // Get rid of parentheses.
    String[] coords = part.split(",\\s*");
    int x = Integer.parseInt(coords[0]);
    int y = Integer.parseInt(coords[1]);
    System.out.printf("x=%d, y=%d\n", x, y);
}
Run Code Online (Sandbox Code Playgroud)

(?<=\\)) 正回顾后发意味着它必须在前面加).在(?=\\() 正向前查找意味着它必须由suceeded (.这(,\\s*)意味着必须在之后的,任何空间上拆分它.将\\在这里只是逃避特定的正则表达式,字符.

也就是说,特定字符串可以识别为结果List#toString().你确定你做得对吗?;)

根据评论更新,您确实可以做相反的方式并摆脱非数字:

String string = "[(1, 2), (2, 3), (3, 4)]";
String[] parts = string.split("\\D.");
for (int i = 1; i < parts.length; i += 3) {
    int x = Integer.parseInt(parts[i]);
    int y = Integer.parseInt(parts[i + 1]);
    System.out.printf("x=%d, y=%d\n", x, y);
}
Run Code Online (Sandbox Code Playgroud)

\\D意味着它必须在任何\\d数字(数字代表)上分割.该.装置之后,它应该消除数字后的任何空白匹配.但我必须承认,我不确定如何消除数字的空白匹配.我还不是一个训练有素的正则表达大师.嘿,巴特K,你能做得更好吗?

毕竟,为此最好使用解析器.请参阅Huberts关于此主题的答案.

  • 话虽这么说,在解析坐标的特定情况下,我会建议从我的答案或Hubert建议的`Scanner`解决方案中更简单/更易于理解的解决方案. (2认同)