首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Regex/ Split () (?)有效地拆分<endpoint1>,<endpoint2>

使用Regex/ Split () (?)有效地拆分<endpoint1>,<endpoint2>
EN

Stack Overflow用户
提问于 2020-02-13 11:01:43
回答 1查看 29关注 0票数 0

我目前正在开发一个用户界面,并且已经实现了命令add track <startpoint> -> <endpoint>。 现在,我要实现命令add switch <startpoint> -> <endpoint1>,<endpoint2>。 但是,我不知道如何有效地拆分第三个参数(<endpoint1>,<endpoint2>)。 下面是我使用add track命令所做的工作:

代码语言:javascript
复制
        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(),.,?)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-13 12:48:49

您可以使用split做任何事情,就像您正在做的那样。但是,如果您希望在输入方面更加灵活,您可能允许用户更自由地使用或不使用空间。例如,可能允许用户以(123, 456)的形式输入坐标。或者可能没有必要在->操作符的两边都有空格。在这种情况下,可以使用一个regex来识别完整的命令:

代码语言:javascript
复制
^\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 Demo

  1. ^\s*add\s+switch\s*匹配字符串的开头,后面是0或多个空格,后面是add,后面是一个或多个空格,后面是switch,后面是0或更多空格。
  2. (?:\(\s*(\d+)\s*,\s*(\d+)\s*\))坐标:(后面跟着0或更多空格,后面跟着1或更多位数,后面是0或更多空格,后面是0或更多空格,后面是0或更多空格,后面是1位或更多数字,后面是0或多个空格,后面是)
  3. \s*->\s*匹配0或多个空格,然后是->,后面是0或多个空格。
  4. (?:\(\s*(\d+)\s*,\s*(\d+)\s*\))匹配坐标。
  5. \s*,\s*匹配0或多个空格,然后是,,后面是0或多个空格。
  6. (?:\(\s*(\d+)\s*,\s*(\d+)\s*\))匹配坐标。
  7. \s*$匹配0或多个空格,后面跟着字符串的结尾。

第一坐标将位于捕获组1和2中,第二坐标位于捕获组3和4中,第三坐标位于捕获组5和6中。

样本代码:

代码语言:javascript
复制
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();
            }
        }
    }
}

指纹:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60206270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档