我在写一个URL验证器。首先,它检查输入的特殊字符。其次,它增加了'http://‘’并检查有效性。
/* Returns true if url is valid */
private static boolean isValidURL(String url) {
boolean containsSpecialCharacters = specialCharactersExists(url);
if ( !containsSpecialCharacters ) {
/* Try creating a valid URL */
try {
new URL(String.format("%s%s", "http://", url)).toURI();
return true;
} catch (Exception e) {
/* Not a valid URL */
}
}
return false;
}
/* Returns true if url contains special characters */
private static boolean specialCharactersExists(String input) {
Pattern regex = Pattern.compile("[^A-Za-z0-9.-]");
Matcher matcher = regex.matcher(input);
return matcher.find();
}这是我的目的。我正在寻求关于如何改进代码(特别是Regex部分)的建议。
发布于 2019-09-19 06:51:18
欢迎来到代码评审!
该方法实际上不检查URL是否有效,因为它允许非URL的值。因此,它不应该被命名为"isValidURL“。它应该是isValidAddress或类似的,但不是URL。URL有一个定义很好的语法。
不需要将specialCharactersExists(url)的返回值存储到变量。它只添加了一个不必要的大if语句。相反,检查值并尽早退出。此外,您检查的字符并不特殊,它们在您的实现中是“非法的”或“无效的”,因此更改名称以反映这一点:
if (illegalCharactersExist(url)) {
return false;
}不应该更改的变量应该标记为final。如果您决定保留containsSpecialCharacters变量,则应该将其标记为final (并将其命名为上文所示)。
final boolean containsIllegalCharacters = illegalCharactersExist(url);模式类是螺纹安全。您应该将模式编译一次到静态变量中,并在matcher中重用它。同时,regex也不是一个好名字。它告诉变量是什么,而不是它的目的是什么。命名应该始终反映目的。
private static final Pattern ILLEGAL_CHAR_PATTERN = Pattern.compile("[^A-Za-z0-9.-]");https://codereview.stackexchange.com/questions/229280
复制相似问题