如何使用 Java 检查正则表达式中的多个 [args]?

How do I check for multiple [args] in a regex with Java?

提问人:FairOPShotgun 提问时间:5/25/2021 最后编辑:FairOPShotgun 更新时间:6/19/2021 访问量:111

问:

我正在制作一款主机游戏。我希望能够同时检查 2 个人的信息。就我而言,我想发出“kill checker”命令。命令是

~killc [username]

使用此命令,我将能够检查 1 个人的杀戮。如果我想检查 2 个人怎么办?我将如何使用我的 .matches(regex) 来计算 2 个字符串?我试过打字:

"^~killc [^ ] [^ ]+$", and "^~killc [^ ] + [a-zA-Z]+$"

但它们不起作用。 有关详细信息,请阅读下面的代码。

import java.util.Scanner;
class StackOverflowExample {
  static int kills = 10;
  public static void main(String[] args) {
    
    System.out.println("Kill count command: ~killc [username]");
    Scanner userInt = new Scanner(System.in);
    String userInput = userInt.nextLine();
    if (userInput.matches("^~killc [^ ]+$"/**How would I input more than one username?**/)){
      String[] parts = userInput.split(" ");
      String username = parts[1];
      System.out.printf("%s has " + kills + " kills.",username);
      
    }
    
  }
}

Java 正则表达 式控制台 命令 java.util.scanner

评论

0赞 Nick Reed 5/25/2021
这究竟是如何“不起作用”的?您是否收到错误消息、意外输出或比“不起作用”更具体的内容?
0赞 FairOPShotgun 5/25/2021
@NickReed 什么也没发生。我播放代码,它就结束了。

答:

0赞 Nick Reed 5/25/2021 #1

重复的小组怎么样?

^~killc(?: [^ ]+)+$

当输入命令时,这将捕获一个或多个用户名。实际上解析它们取决于您,但如果用户名格式正确,这将捕获它们。 就个人而言,我会非常小心,因为它会接受换行符作为匹配项;如果它可用,请尝试,这将匹配任何不是空格的内容。[^ ]+\S+

1赞 The fourth bird 5/25/2021 #2

您可以将模式与捕获组一起使用,并在空间上拆分捕获组的值。

^~killc (\S+(?: \S+)*)$
  • ^字符串的开头
  • ~killc\h+匹配和 1+ 个空格~killc
  • (捕获组 1
    • \S+(?:\h+\S+)*匹配 1+ 个非 whitspace 字符,并选择性地重复 1+ 个空格和 1+ 个非 whitspace 字符
  • )关闭组 1
  • $字符串末尾

正则表达式演示

System.out.println("Kill count command: ~killc [username]");
Scanner userInt = new Scanner(System.in);
String regex = "^~killc\\h+(\\S+(?:\\h+\\S+)*)$";
String userInput = userInt.nextLine();

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(userInput);

if (matcher.find()) {
    for (String username : matcher.group(1).split(" "))
        System.out.printf("%s has " + kills + " kills.\n",username);
}

如果输入是~killc test1 test2

输出将是

Kill count command: ~killc [username]
test1 has 10 kills.
test2 has 10 kills.

Java 演示