首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Regex和java.net.URL验证URL

使用Regex和java.net.URL验证URL
EN

Code Review用户
提问于 2019-09-18 23:36:55
回答 1查看 1.9K关注 0票数 3

我在写一个URL验证器。首先,它检查输入的特殊字符。其次,它增加了'http://‘’并检查有效性。

代码语言:javascript
复制
    /* 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部分)的建议。

EN

回答 1

Code Review用户

回答已采纳

发布于 2019-09-19 06:51:18

欢迎来到代码评审!

坏命名

该方法实际上不检查URL是否有效,因为它允许非URL的值。因此,它不应该被命名为"isValidURL“。它应该是isValidAddress或类似的,但不是URL。URL有一个定义很好的语法

不必要变量

不需要将specialCharactersExists(url)的返回值存储到变量。它只添加了一个不必要的大if语句。相反,检查值并尽早退出。此外,您检查的字符并不特殊,它们在您的实现中是“非法的”或“无效的”,因此更改名称以反映这一点:

代码语言:javascript
复制
    if (illegalCharactersExist(url)) {
        return false;
    }

错过了最终的

不应该更改的变量应该标记为final。如果您决定保留containsSpecialCharacters变量,则应该将其标记为final (并将其命名为上文所示)。

代码语言:javascript
复制
final boolean containsIllegalCharacters = illegalCharactersExist(url);

复用模式

模式类是螺纹安全。您应该将模式编译一次到静态变量中,并在matcher中重用它。同时,regex也不是一个好名字。它告诉变量是什么,而不是它的目的是什么。命名应该始终反映目的。

代码语言:javascript
复制
    private static final Pattern ILLEGAL_CHAR_PATTERN = Pattern.compile("[^A-Za-z0-9.-]");
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/229280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档