区分一字、二字和三字命令

Distinguish between one-, two- and three-word commands

现在,我正在使用这种方法来检查用户是否刚刚输入了带有错误参数的命令:

    private boolean relatedCommand(String input) {
        // make sure the split afterwards has at least size one
        if (input.matches(" .*")) {
            return false;
        }
        final String command = input.split(" ".toString())[0];
        return COMMAND_PACKAGE
                .keySet()
                .stream()
                .map(Pattern::toString)
                .anyMatch(patternText -> patternText.startsWith(command + " ");
    }

(COMMAND_PACKAGE 包含所有已注册的命令)

现在,这对于单字命令非常有效。例如get <argument1> <argument2>, remove <argument1>.

但是,我目前正在从事一个同时具有单词和双词命令的项目。 以下是一系列不适用于此方法的命令: add track <argument1>add switch <argument1>step <argument>。在这种情况下,对于命令 add track <argument1>,"track" 被视为一个参数,但它实际上属于命令本身。

如果用户只输入 "add",则错误消息为 "invalid arguments"。相反,错误消息应该更准确,告诉他这个命令不存在(因为只有 "add track" 或 "add switch")。

有谁知道如何区分单字命令和双字命令?用户也可以使用由三个字组成的命令delete rolling stock <argument>

总而言之,需要区分一字、二字、三字的命令。

方法 String.split("\s+") 将您在空格处的输入拆分为一个数组。你可以查询那个数组的长度,然后你就知道你的输入包含了多少个单词。

import java.util.Arrays;
import java.util.Scanner;

class Main
{
    public static void main(String[] args)
    {
        System.out.println("Enter a command");
        Scanner in=new Scanner(System.in);
        String command=in.nextLine();
        String[] parts=command.split("\s+");
        System.out.println("parts="+Arrays.toString(parts));
        if (parts.length==0)
        {
            System.out.println("Zero parts");
        }
        else if (parts.length==1)
        {
            System.out.println("One part");
        }
        else if (parts.length==2)
        {
            System.out.println("Two parts");
        }
        else if (parts.length==3)
        {
            System.out.println("Three parts");
        }
        else
        {
            System.out.println("More than three parts");
        }
    }
}

输出:

Enter a command
a b c
parts=[a, b, c]
Three parts

进程已完成,退出代码为 0

老实说,解决这个问题的最简单和最有效的方法是创建包含两个或三个单词的命令列表,然后在单独的方法中简单地执行匹配,这样如果你点击了一个关键字是较长命令的一部分,您检查下一个单词是否是您期望的命令的一部分。

根据命令的具体规范等,您也许可以使用 HashMap<String, HashMap<String, String>> 来表示命令。这样你就可以简单地做一些事情,比如将前缀存储为键,然后将后缀存储为值。

您可能想尝试使用 LinkedHashMap,然后将命令按最复杂(带空格)的顺序放在首位。这样他们将首先匹配。

A LinkedHashMap 保留添加键的顺序。