我有一个格式的字符串"[(1, 2), (2, 3), (3, 4)]",具有任意数量的元素.我想将它拆分的逗号分隔的坐标,也就是检索(1, 2),(2, 3)和(3, 4).
我可以用Java正则表达式吗?我是一个完整的菜鸟,但希望Java正则表达式足够强大.如果不是,你能建议一个替代方案吗?
来自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.
你可以用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关于此主题的答案.