我正在寻找有关如何验证用户输入的建议。我的任务是根据用户的文本输入执行命令。我唯一担心的是可以接受的命令有很多种。
例如,这些命令都是可以接受的并且做同样的事情,"显示游戏板"
sh board,
sho board,
展示板,
show bo,
sho bo,
sh bo
大约有10个其他命令共享这个类似的属性,所以我想知道验证用户输入的最佳做法是什么?
我应该将所有不同的组合存储在散列图中吗?
答案 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));
}
}