每当我检查用户输入时,它总是变得非常混乱。这方面的一个例子可能是地址输入。你可以有以下几种:
主街13B主街13号B主街13b13 B,大街
如果我对它进行编码,它最终会像一样
String number,letter,street; //To be filled with "13","B","Main Street"
String address = getUserInput();
String[] tokens = address.split(" ");
if(tokens[0].isNumeric() == false){
//It could be 13B rather than 13
String number = "";
for(Character c: tokens[0].toCharArray()){
if(c.isDigit() == false){
//We could have found the apartment letter
if(number.isEmpty()){
//The address is invalid, throw error.
} else {
//Make sure it was a letter
if(c.isLetter()){
letter = c;
} else {
//throw error
}
}
} else {
number += c;
}
}
} else {
//...continue all other possibilities
}
请注意,上面的代码是我很快拼凑起来的——有些方法不存在,它也不会编译。
我的观点是它看起来很乱。如果里面有那么多如果。当我看着它时,我看到了一些非常不自然的东西。若我真的对整个东西进行编码,能够以这4种格式获取地址,那将是几十行代码。
这里有我错过的把戏吗?有没有办法让它不那么难看?
正则表达式通常用于输入验证,与您的问题密切相关。一个优秀的教程可以在这里找到:http://www.vogella.com/articles/JavaRegularExpressions/article.html
检查每个可能的排列几乎是不可能的。最好是确保它只包含数字或字母,可能使用regex
。原因是有这么多不同类型的地址,你不可能解释所有的。然而,你知道地址街只有字母和数字(有时是-
或连字符),但我认为你明白了。你可以检查以确保地址只包含有效字符,但任何超出这一范围的内容都会很混乱;耗时。
通过使用正则表达式,您可以检查以确保地址在1或2行代码中只包含有效字符,这样会更干净。
类似:
String address = getUserInput();
if(address.matches("[^A-Za-z0-9]*"))
{
//perform actions for accurate address
}
else
{
//do other action for invalid address
}
您将始终需要检查字符串是空的(即检查CharSequence是否为空(")或null)还是空白的(即检测CharSequence是空白、空(")还是null)以及许多其他内容。
甚至还有一些方便的方法,比如isNotBlank和isNotEmpty,可以让你免于否定逻辑条件。
Apache Commons StringUtils可以很容易地为您做到这一点。