验证输入java

时间:2015-10-16 18:31:01

标签: java validation input hashmap

我正在寻找有关如何验证用户输入的建议。我的任务是根据用户的文本输入执行命令。我唯一担心的是可以接受的命令有很多种。

例如,这些命令都是可以接受的并且做同样的事情,"显示游戏板"

  

sh board,
  sho board,
  展示板,
  show bo,
  sho bo,
  sh bo

大约有10个其他命令共享这个类似的属性,所以我想知道验证用户输入的最佳做法是什么?

我应该将所有不同的组合存储在散列图中吗?

5 个答案:

答案 0 :(得分:1)

查看正则表达式(正则表达式)。当您想要使用不一定完整的值时,这些非常适用。

例如: 说我键入“shutdo” 使用正则表达式,您可以让程序理解字符串“shutd”后的任何内容都意味着powerOff()

答案 1 :(得分:0)

如果命令非常具体且有限,我只会将它们全部添加到某些数据结构中(哈希就是其中之一)。

如果问题是您应该了解用户输入应该做什么,那么我会说使用正则表达式或简单的模式验证找到模式(看起来他们都是两个单词,首先开始“sh”,第二个以“bo”开头。

但老实说,~15个命令在空间/效率方面并不是那么重要。

修改

  

大约有10个其他命令共享这个类似的属性

如果这意味着10个更多命令,比如“show board”,那么我会说将它存储在哈希中。但如果我误解了你并且你的意思是有10个其他命令做类似的事情(“设置片段”,“设置饼”,“se pi”等),那么RegEx就是你要走的路。

答案 2 :(得分:0)

看起来允许的最小命令长度为2。 因此,首先要检查术语的长度是否至少为2。

接下来,您可以遍历可用的命令, 并在第一个以术语开头的位置停止,例如:

List<String> commands = Arrays.asList("show", "create", "delete");
for (String command : commands) {
    if (command.startsWith(term)) {
        // found a match, command is: command
        break;
    }
}

答案 3 :(得分:0)

如果我理解正确,有N个不同的命令,可以组合。只要它保持明确,就应该允许缩写每个命令。

如果是这种情况,以下方法expandCommands(String)expandCommand(String)将规范化每个命令部分。

public class Main {
    static Set<String> availableCommands = new HashSet<>(Arrays.asList(
            "show",
            "board",
            "btest"
    ));


    public static void main(String[] args) throws Exception {
        List<String> testData = Arrays.asList(
                "sh board",
                "sho board",
                "show board",
                "show bo",
                "sho bo",
                "sh bo"
        );


        String expected = "show board";
        for (String test : testData) {
            String actual = expandCommands(test);

            if (!expected.equals(actual)) {
                System.out.println(test + "\t"+  actual);
            }

        }


        try {
            expandCommands("sh b");
            throw new IllegalStateException();
        } catch (Exception e) {
            if (!"not unique command: b".equals(e.getMessage())) {
                throw new Exception();
            }
        }

        try {
            expandCommands("sh asd");
            throw new IllegalStateException();
        } catch (Exception e) {
            if (!"unknown command: asd".equals(e.getMessage())) {
                throw new Exception();
            }
        }


    }

    private static String expandCommands(String aInput) throws Exception {
        final String[] commandParts = aInput.split("\\s+");


        StringBuilder result = new StringBuilder();

        for (String commandPart : commandParts) {
            String command = expandCommand(commandPart);

            result.append(command).append(" ");
        }


        return result.toString().trim();
    }

    private static String expandCommand(final String aCommandPart) throws Exception {
        String match = null;

        for (String candidate : availableCommands) {
            if (candidate.startsWith(aCommandPart)) {
                if (match != null) {
                    throw new Exception("not unique command: " + aCommandPart);
                }

                match = candidate;
            }
        }


        if (match == null) {
            throw new Exception("unknown command: " + aCommandPart);
        }

        return match;
    }

}

Set<String> availableCommands包含所有可能的命令。

如果输入命令只是一个可用命令的开头,则检查输入命令的每个部分。

答案 4 :(得分:0)

您可以使用reg-ex匹配来验证输入。例如,下面的模式将匹配以sh开头,后跟0或更多字符的所有内容,然后是space,然后是bo,后跟0或更多字符。

public class Validator {
    public static void main (String[] args) {
    String pattern = "sh[\\w]* bo[\\w]*";
    System.out.println(args[0].matches(pattern));
  }
}