如何在 java 中验证 URL(domain) 允许通配符 (*, %)
how can I validate URL(domain) allowing wildcard(*, %) in java
我想检查验证 URL 是否允许 java 中的通配符。
我在 java (, urlValidator) 中找到了一些关于验证 URL 的好例子,但这些例子没有提供通配符。
这是我正在练习的内容:
代码(urlValidator)
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);
}
输出
true
true
false
代码(正则表达式)
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());
}
}
}
结果
我想做的就是以上URL有效
我该如何解决这个问题?
如有任何意见,我们将不胜感激。谢谢。
更新
我去掉了方案部分并在答案后面的域部分添加了 |* 和 |\.*(|* 和 |.* 给我一个错误 - 无效的转义序列(有效的是 \b \ t \n \f \r \" \' ) - 但我不确定更改是否正确。
现在不允许"google.com";但允许其他人("www.google.com", "google.com", ".google.com", ".com")
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");
}
TEST START
[O] www.google.com
[O] google.com
[O] *.google.com
[O] *.com
DONE
需要任何帮助。谢谢。
对此持保留态度,我现在无法访问 Java 并且是凭空想到的,所以如果这里有错误,随时纠正我。
您需要更新正则表达式以包含通配符。这不是微不足道的,考虑到那件事有多复杂。
让我们首先分解你的正则表达式:
(?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*
)?
$
我们现在可以看到方案有组,username/password 对(具有 @
字符的组),域本身的大组和端口组一个用于可能的路径、查询或片段部分。大组可以分为两部分(由 |
(OR) 分隔),第一部分用于 IP 地址,具有否定前瞻性以禁止本地 IP,后者用于命名域,由一个或更多部分由点分隔,最后是 TLD。
那么你需要做什么来允许通配符?在你想要的每个组中添加一个通配符(*
或%
)允许用通配符代替:
如果要允许 方案 使用通配符,请在此处添加一个:
(?:
(?:
https?|ftp
|\* <-----
)
://
)
如果你想允许用户名and/or密码部分的通配符,你不需要做任何事情,你的正则表达式已经允许任何非空白字符, 所以 *:*@
或 *@
已经有效。
如果要允许 域名 使用通配符,请在此处添加它们:
(?:
(?:
[a-z\u00a1-\uffff0-9]-*
)*
[a-z\u00a1-\uffff0-9]+
|\* <-----
)
(?:
\.
(?:
[a-z\u00a1-\uffff0-9]-*
)*
[a-z\u00a1-\uffff0-9]+
|\.\* <-----
)*
如果您想允许 TLD 使用通配符,请在此处添加一个:
(?:
\.
(?:
[a-z\u00a1-\uffff]{2,}
|\* <-----
)
)
如果要允许 端口 使用通配符,请在此处添加一个:
(?:
:\d{2,5}
|:\* <-----
)?
如果你想允许 paths 的通配符,你不需要做任何事情,你的正则表达式已经涵盖了(/*
和 /*/*/foobar
等已经有效)。
最后但并非最不重要的一点是,如果您希望方案和域名一起使用通配符(如您的示例),您需要添加一个新组和或它在:
|
(?:
\*
\.
(?:
[a-z\u00a1-\uffff]{2,}
)
)
(?:
:\d{2,5}
)?
(?:
[/?#]\S*
)?
基本上只需将其添加到最后一组之后和 $
符号之前。不要忘记在 TLD and/or 端口添加通配符,如果需要的话。
我想检查验证 URL 是否允许 java 中的通配符。
我在 java (
这是我正在练习的内容:
代码(urlValidator)
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);
}
输出
true
true
false
代码(正则表达式)
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());
}
}
}
结果
我想做的就是以上URL有效
我该如何解决这个问题?
如有任何意见,我们将不胜感激。谢谢。
更新
我去掉了方案部分并在答案后面的域部分添加了 |* 和 |\.*(|* 和 |.* 给我一个错误 - 无效的转义序列(有效的是 \b \ t \n \f \r \" \' ) - 但我不确定更改是否正确。
现在不允许"google.com";但允许其他人("www.google.com", "google.com", ".google.com", ".com")
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");
}
TEST START
[O] www.google.com
[O] google.com
[O] *.google.com
[O] *.com
DONE
需要任何帮助。谢谢。
对此持保留态度,我现在无法访问 Java 并且是凭空想到的,所以如果这里有错误,随时纠正我。
您需要更新正则表达式以包含通配符。这不是微不足道的,考虑到那件事有多复杂。
让我们首先分解你的正则表达式:
(?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*
)?
$
我们现在可以看到方案有组,username/password 对(具有 @
字符的组),域本身的大组和端口组一个用于可能的路径、查询或片段部分。大组可以分为两部分(由 |
(OR) 分隔),第一部分用于 IP 地址,具有否定前瞻性以禁止本地 IP,后者用于命名域,由一个或更多部分由点分隔,最后是 TLD。
那么你需要做什么来允许通配符?在你想要的每个组中添加一个通配符(*
或%
)允许用通配符代替:
如果要允许 方案 使用通配符,请在此处添加一个:
(?:
(?:
https?|ftp
|\* <-----
)
://
)
如果你想允许用户名and/or密码部分的通配符,你不需要做任何事情,你的正则表达式已经允许任何非空白字符, 所以 *:*@
或 *@
已经有效。
如果要允许 域名 使用通配符,请在此处添加它们:
(?:
(?:
[a-z\u00a1-\uffff0-9]-*
)*
[a-z\u00a1-\uffff0-9]+
|\* <-----
)
(?:
\.
(?:
[a-z\u00a1-\uffff0-9]-*
)*
[a-z\u00a1-\uffff0-9]+
|\.\* <-----
)*
如果您想允许 TLD 使用通配符,请在此处添加一个:
(?:
\.
(?:
[a-z\u00a1-\uffff]{2,}
|\* <-----
)
)
如果要允许 端口 使用通配符,请在此处添加一个:
(?:
:\d{2,5}
|:\* <-----
)?
如果你想允许 paths 的通配符,你不需要做任何事情,你的正则表达式已经涵盖了(/*
和 /*/*/foobar
等已经有效)。
最后但并非最不重要的一点是,如果您希望方案和域名一起使用通配符(如您的示例),您需要添加一个新组和或它在:
|
(?:
\*
\.
(?:
[a-z\u00a1-\uffff]{2,}
)
)
(?:
:\d{2,5}
)?
(?:
[/?#]\S*
)?
基本上只需将其添加到最后一组之后和 $
符号之前。不要忘记在 TLD and/or 端口添加通配符,如果需要的话。