使用regex/split()高效地拆分< endpoint1>,< endpoint2>(?)

2skhul33  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(385)

我目前正在开发一个用户界面,并且已经实现了这个命令 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]));

顺便说一句:点= (<x-coordinate>,<y-coordinate>) . parsepoint方法使用regex检查“\(\d+,\d+\)”的模式。
所以我想创建另一个点 Point secondEndPoint = new Point(...); 对于终结点2。我该怎么做(regex,.split(),…,?)。

xqnpmsa8

xqnpmsa81#

你什么都可以做 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*$

查看regex演示 ^\s*add\s+switch\s* 匹配字符串的开头,后跟0个或多个空格,后跟 add 后跟1个或多个空格后跟 switch 后跟0个或多个空格。 (?:\(\s*(\d+)\s*,\s*(\d+)\s*\)) a坐标:a ( 后跟0个或多个空格,后跟1个或多个数字,后跟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 = 2

相关问题