Java 拆分<;端点1>&书信电报;终点2>;有效地使用Regex/Split()(?)

Java 拆分<;端点1>&书信电报;终点2>;有效地使用Regex/Split()(?),java,regex,split,Java,Regex,Split,我目前正在开发一个用户界面,并且已经实现了命令addtrack-> 现在,我想实现命令addswitch->, 但是,我不知道如何有效地分割第三个参数(,) 这就是我使用addtrack命令所做的: 顺便说一句:点=(,)。parsePoint方法使用正则表达式检查模式“\(\d+,\d+\)” 所以我想创建另一个点pointsecondendpoint=newpoint(…)。我如何才能做到这一点(regex、.split(),…,?)。您可以在执行时使用split完成所有操作。但是,如果您想

我目前正在开发一个用户界面,并且已经实现了命令
addtrack->

现在,我想实现命令
addswitch->,

但是,我不知道如何有效地分割第三个参数(

这就是我使用
addtrack
命令所做的:

顺便说一句:点=
(,)
。parsePoint方法使用正则表达式检查模式“\(\d+,\d+\)”


所以我想创建另一个点
pointsecondendpoint=newpoint(…)。我如何才能做到这一点(regex、.split(),…,?)。

您可以在执行时使用
split
完成所有操作。但是,如果您想更灵活地允许哪些内容作为输入,您可以允许用户更自由地使用或不使用空间。例如,可能允许用户以
(123456)
的形式输入坐标。或者,
->
运算符的两侧可能不需要空格。在这种情况下,可以使用一个正则表达式来识别完整的命令:

^\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
    ,后跟1个或多个空格,后跟
    switch
    后跟0个或多个空格
  • (?:\(\s*(\d+)\s*,\s*(\d+)\s*)
    坐标:A
    后跟0个或多个空格,后跟1个或多个数字,后跟0个或多个空格,后跟一个
    后跟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();
                }
            }
        }
    }
    
    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