我目前正在开发一个用户界面,并且已经实现了命令
add track <startpoint> -> <endpoint>。 现在,我要实现命令add switch <startpoint> -> <endpoint1>,<endpoint2>。 但是,我不知道如何有效地拆分第三个参数(<endpoint1>,<endpoint2>)。 下面是我使用add track命令所做的工作:
String startPointStr = InputPattern.parsePoint(args.get(0));
String endPointStr = InputPattern.parsePoint(args.get(2));
// TODO: Can I improve the code?
String[] startCoords = startPointStr.substring(1, startPointStr.length() - 1).split(",");
Point startPoint = new Point(Integer.parseInt(startCoords[0]), Integer.parseInt(startCoords[1]));
String[] endCoords = endPointStr.substring(1, endPointStr.length() - 1).split(",");
Point endPoint = new Point(Integer.parseInt(endCoords[0]), Integer.parseInt(endCoords[1]));顺便说一下: Point = (<x-coordinate>,<y-coordinate>)__。方法parsePoint使用Regex检查模式是否为"(\d+,\d+)“。
因此,我想为endpoint2创建另一个Point endpoint2。我如何做到这一点(regex,.split(),.,?)。
发布于 2020-02-13 12:48:49
您可以使用split做任何事情,就像您正在做的那样。但是,如果您希望在输入方面更加灵活,您可能允许用户更自由地使用或不使用空间。例如,可能允许用户以(123, 456)的形式输入坐标。或者可能没有必要在->操作符的两边都有空格。在这种情况下,可以使用一个regex来识别完整的命令:
^\s*add\s+switch\s*(?:\(\s*(\d+)\s*,\s*(\d+)\s*\))\s*->\s*(?:\(\s*(\d+)\s*,\s*(\d+)\s*\))\s*,\s*(?:\(\s*(\d+)\s*,\s*(\d+)\s*\))\s*$^\s*add\s+switch\s*匹配字符串的开头,后面是0或多个空格,后面是add,后面是一个或多个空格,后面是switch,后面是0或更多空格。(?:\(\s*(\d+)\s*,\s*(\d+)\s*\))坐标:(后面跟着0或更多空格,后面跟着1或更多位数,后面是0或更多空格,后面是0或更多空格,后面是0或更多空格,后面是1位或更多数字,后面是0或多个空格,后面是)。\s*->\s*匹配0或多个空格,然后是->,后面是0或多个空格。(?:\(\s*(\d+)\s*,\s*(\d+)\s*\))匹配坐标。\s*,\s*匹配0或多个空格,然后是,,后面是0或多个空格。(?:\(\s*(\d+)\s*,\s*(\d+)\s*\))匹配坐标。\s*$匹配0或多个空格,后面跟着字符串的结尾。第一坐标将位于捕获组1和2中,第二坐标位于捕获组3和4中,第三坐标位于捕获组5和6中。
样本代码:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Test
{
public static void main(String[] args) {
String tests[] = {
"add switch(123,456)->(45,67),(8,100)",
" add switch (19 , 310) -> (21 , 890) , (1 , 2) "
};
for (String test: tests) {
Pattern pattern = Pattern.compile("^\\s*add\\s+switch\\s*(?:\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\))\\s*->\\s*(?:\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\))\\s*,\\s*(?:\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\))\\s*$");
Matcher m = pattern.matcher(test);
if (m.find()) {
for (int i = 0; i <= 6; ++i) {
System.out.println("Group " + i + " = " + m.group(i));
}
System.out.println();
}
}
}
}指纹:
Group 0 = add switch(123,456)->(45,67),(8,100)
Group 1 = 123
Group 2 = 456
Group 3 = 45
Group 4 = 67
Group 5 = 8
Group 6 = 100
Group 0 = add switch (19 , 310) -> (21 , 890) , (1 , 2)
Group 1 = 19
Group 2 = 310
Group 3 = 21
Group 4 = 890
Group 5 = 1
Group 6 = 2https://stackoverflow.com/questions/60206270
复制相似问题