首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在java中验证允许通配符(*,%)的URL(域)

如何在java中验证允许通配符(*,%)的URL(域)
EN

Stack Overflow用户
提问于 2018-05-21 11:34:45
回答 1查看 1.7K关注 0票数 5

我想检查验证URL,允许在java中通配符。

我找到了一些在java (REGEXurlValidator)中验证URL的很好的例子,但是这些例子并没有提供通配符。

下面是我练习的内容:

代码(UrlValidator)

代码语言:javascript
复制
public void urlValidiTest(){
    System.out.println(this.urlCheck("https://www.google.com"));
    System.out.println(this.urlCheck("https://google.com"));
    System.out.println(this.urlCheck("*.com"));
}

public boolean urlCheck(String url){
    return new UrlValidator().isValid(url);
}

输出

真的 真的 错误

代码(Regex)

代码语言:javascript
复制
public void regexTest() {
  String[] URLs = new String[] { "http://www.google.com", "http://google.com/","*.com" };
    Pattern REGEX = Pattern.compile("(?i)^(?:(?:https?|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?$");
    for (String url : URLs) {
        Matcher matcher = REGEX.matcher(url);
        if (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

结果

http://www.google.com http://google.com/

我想做的是上面的所有网址都是有效的。

我该如何解决这个问题呢?

如有任何意见,将不胜感激。谢谢。

更新

我去掉了方案部分,并在答案后面的域部分中添加了财政*和财政。*给出了一个错误--无效的转义序列(有效的转义序列是\b \n \f \r \“\\”--但我不确定更改是否正确)。

现在它不允许"google.com",但是允许其他人(“www.google.com”、“google.com”、".google.com“、".com")

代码语言:javascript
复制
 public void regexValidator(String str){

    Pattern REGEX = Pattern.compile(""
            + "(?i)^(?:\\S+(?::\\S*)?@)"
            + "?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)"
            + "(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])"
            + "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|"

            //DOMAIN
            + "(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+|\\*)"
            + "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*"
            //

            + "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))\\.?)"
            + "(?::\\d{2,5})?(?:[/?#]\\S*)?$");

    Matcher _matcher = REGEX.matcher(str);
    if(_matcher.find()){
        System.out.println("[O] " + str);
    }
    else {
        System.out.println("[X]" + str);
    }
}

public void validate(){
    System.out.println("TEST START");
    this.regexValidator("https://www.google.com");
    this.regexValidator("www.google.com");
    this.regexValidator("google.com");
    this.regexValidator("*.google.com");
    this.regexValidator("*.com");
    System.out.println("DONE");
}

测试启动 X O www.google.com O google.com O *.google.com O *.com 完成

需要任何帮助。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-21 12:30:09

我现在无法访问Java,因此如果这里有错误,请随时纠正我。

您需要更新regex以包含通配符。考虑到这件事有多复杂,这可不是件小事。

,让我们首先分析一下您拥有的正则表达式:

代码语言:javascript
复制
(?i)
^
    (?:
        (?:
            https?|ftp
        )
        ://
    )
    (?:
        \S+
        (?:
            :\S*
        )?
        @
    )?
    (?:
        (?!
            (?:
                10|127
            )
            (?:
                \.\d{1,3}
            ){3}
        )
        (?!
            (?:
                169\.254|192\.168
            )
            (?:
                \.\d{1,3}
            ){2}
        )
        (?!
            172\.
            (?:
                1[6-9]|2\d|3[0-1]
            )
            (?:
                \.\d{1,3}
            ){2}
        )
        (?:
            [1-9]\d?|1\d\d|2[01]\d|22[0-3]
        )
        (?:
            \.
            (?:
                1?\d{1,2}|2[0-4]\d|25[0-5]
            )
        ){2}
        (?:
            \.
            (?:
                [1-9]\d?|1\d\d|2[0-4]\d|25[0-4]
            )
        )
        |
        (?:
            (?:
                [a-z\u00a1-\uffff0-9]-*
            )*
            [a-z\u00a1-\uffff0-9]+
        )
        (?:
            \.
            (?:
                [a-z\u00a1-\uffff0-9]-*
            )*
            [a-z\u00a1-\uffff0-9]+
        )*
        (?:
            \.
            (?:
                [a-z\u00a1-\uffff]{2,}
            )
        )
        \.?
    )
    (?:
        :\d{2,5}
    )?
    (?:
        [/?#]\S*
    )?
$

现在我们可以看到方案的组、用户名/密码对(带有@字符的组)、域本身的大组、端口组和可能的路径、查询或片段部分的组。大组可以分为两个部分(由| ( or )分隔),第一部分是IP地址,具有不允许本地IP的负面外观,后者用于命名域,由一个或多个被点分隔的部分组成,最后是TLD。

,那么您需要做什么才能允许通配符呢?在您希望允许的每个组中添加一个通配符字符(*%),以便被通配符替换:

如果要允许方案的通配符,请在这里添加一个:

代码语言:javascript
复制
    (?:
        (?:
            https?|ftp
            |\*    <-----
        )
        ://
    )

如果希望允许用户名和/或密码部分通配符,则不需要做任何操作,正则表达式已经允许任何非空格字符,因此*:*@*@已经有效。

如果希望允许域名的通配符,请在这里添加它们:

代码语言:javascript
复制
        (?:
            (?:
                [a-z\u00a1-\uffff0-9]-*
            )*
            [a-z\u00a1-\uffff0-9]+
            |\*    <-----
        )
        (?:
            \.
            (?:
                [a-z\u00a1-\uffff0-9]-*
            )*
            [a-z\u00a1-\uffff0-9]+
            |\.\*    <-----
        )*

如果要允许TLD的通配符,请在这里添加一个:

代码语言:javascript
复制
        (?:
            \.
            (?:
                [a-z\u00a1-\uffff]{2,}
                |\*    <-----
            )
        )

如果要允许端口的通配符,请在这里添加一个:

代码语言:javascript
复制
    (?:
        :\d{2,5}
        |:\*    <-----
    )?

如果希望为paths允许通配符,则不需要执行任何操作,因为正则表达式已经涵盖了这些操作(/*/*/*/foobar等已经有效)。

最后,但并非最不重要的是,如果您希望允许方案和域名通配符一起使用(如您的示例中所示),则需要添加一个新组并在以下内容中对其进行OR:

代码语言:javascript
复制
    |
    (?:
        \*
        \.
        (?:
            [a-z\u00a1-\uffff]{2,}
        )
    )
    (?:
        :\d{2,5}
    )?
    (?:
        [/?#]\S*
    )?

基本上,只需将其添加到最后一个组后面和$符号之前即可。如果需要,请不要忘记向TLD和/或端口添加通配符。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50447988

复制
相关文章

相似问题

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