gpt4 book ai didi

java - 使用 Regex/Split() 有效分割 , (?)

转载 作者:行者123 更新时间:2023-12-01 18:27:42 25 4
gpt4 key购买 nike

I am currently working on a user interface and have already implemented the command add track <startpoint> -> <endpoint>.

Now, I want to implement the command add switch <startpoint> -> <endpoint1>,<endpoint2>.

However, I am not sure how to efficiently split the third argument (<endpoint1>,<endpoint2>).

This is how I've done it with the add track command:

        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 方法使用正则表达式检查“\(\d+,\d+\)”的模式。

所以我想创建另一个点 Point secondEndPoint = new Point(...);对于端点2。我怎样才能做到这一点(正则表达式,.split(),...,?)。

最佳答案

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

^\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*$

See Regex Demo

  1. ^\s*add\s+switch\s* 匹配字符串开头后跟 0 个或多个空格,后跟 add 后跟 1 个或多个空格后跟 switch 后跟 0 个或多个空格。
  2. (?:\(\s*(\d+)\s*,\s*(\d+)\s*\)) 坐标:A ( 后跟 0 个或多个空格,后跟 1 个或多个数字,后跟 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 中。

示例代码:

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

关于java - 使用 Regex/Split() 有效分割 <endpoint1>,<endpoint2> (?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60206270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com