qum*_*umm 5 java regex url-validation
我想在java中检查验证URL是否允许使用通配符.
我找到了一些关于在java中验证URL的好例子(REGEX,urlValidator),但是那些没有提供通配符.
这是我正在练习的内容:
CODE(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);
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT
真正
真正
假
CODE(正则表达式)
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果
我想要做的是以上所有URL都有效.
我该如何解决这个问题呢?
任何评论将不胜感激.谢谢.
更新
我摆脱了方案部分,并在答案之后的域部分添加了|*和| \.*(|*和|.*给了我一个错误 - 无效的转义序列(有效的是\ b\t \n\f\r \n \"\') - 但我不确定更改是否正确).
现在它不允许"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");
}
Run Code Online (Sandbox Code Playgroud)
测试开始
[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*
)?
$
Run Code Online (Sandbox Code Playgroud)
我们现在可以看到有一些组用于方案、用户名/密码对(带有字符的组@)、一大组用于域本身、一组用于端口、一组用于可能的路径、查询或片段部分。大组可以分为两部分(用|(OR) 分隔),第一部分用于 IP 地址,具有否定前瞻以禁止本地 IP,后者用于命名域,由一个或多个部分组成,用一个点,最后是 TLD。
那么你需要做什么才能允许通配符呢?在您想要允许用通配符替换的每个组中添加通配符(*或):%
如果您想允许该方案使用通配符,请在此处添加一个:
(?:
(?:
https?|ftp
|\* <-----
)
://
)
Run Code Online (Sandbox Code Playgroud)
如果您想允许用户名和/或密码部分使用通配符,则无需执行任何操作,您的正则表达式已经允许任何非空白字符,因此*:*@或*@已经有效。
如果您想允许域名使用通配符,请在此处添加它们:
(?:
(?:
[a-z\u00a1-\uffff0-9]-*
)*
[a-z\u00a1-\uffff0-9]+
|\* <-----
)
(?:
\.
(?:
[a-z\u00a1-\uffff0-9]-*
)*
[a-z\u00a1-\uffff0-9]+
|\.\* <-----
)*
Run Code Online (Sandbox Code Playgroud)
如果您想允许TLD使用通配符,请在此处添加一个:
(?:
\.
(?:
[a-z\u00a1-\uffff]{2,}
|\* <-----
)
)
Run Code Online (Sandbox Code Playgroud)
如果您想允许端口使用通配符,请在此处添加一个:
(?:
:\d{2,5}
|:\* <-----
)?
Run Code Online (Sandbox Code Playgroud)
如果您想允许paths使用通配符,则无需执行任何操作,正则表达式已涵盖(/*等/*/*/foobar已经有效)。
最后但并非最不重要的一点是,如果您想允许方案和域名一起使用通配符(如您的示例中所示),您需要添加一个新组并将其或:
|
(?:
\*
\.
(?:
[a-z\u00a1-\uffff]{2,}
)
)
(?:
:\d{2,5}
)?
(?:
[/?#]\S*
)?
Run Code Online (Sandbox Code Playgroud)
基本上只需将其添加到最后一组后面和$符号之前即可。如果需要,也不要忘记在 TLD 和/或端口中添加通配符。
| 归档时间: |
|
| 查看次数: |
334 次 |
| 最近记录: |