JAVA 中的网站/URL 验证正则表达式
Posted
技术标签:
【中文标题】JAVA 中的网站/URL 验证正则表达式【英文标题】:Website/URL Validation Regex in JAVA 【发布时间】:2014-09-15 10:32:55 【问题描述】:我需要一个正则表达式字符串来匹配以“http://”、“https://”、“www.”、“google.com”开头的 URL
我尝试使用的代码是:
//Pattern to check if this is a valid URL address
Pattern p = Pattern.compile("(http://|https://)(www.)?([a-zA-Z0-9]+).[a-zA-Z0-9]*.[a-z]3.?([a-z]+)?");
Matcher m;
m=p.matcher(urlAddress);
但此代码只能匹配“http://www.google.com”等url
我知道这可能是一个重复的问题,但我已经尝试了所有提供的正则表达式,但它不符合我的要求。有人会帮我吗?谢谢。
【问题讨论】:
您是否要求url必须以"http://"
"https://"
"www."
"google.com"
之一开头?
没有。不仅是谷歌网站。 google.com 只是没有“www”的网站的示例。或其网址中的任何“http 或 https”。
【参考方案1】:
您需要将(http://|https://)
作为可选部分加入您的正则表达式。
^(http:\/\/|https:\/\/)?(www.)?([a-zA-Z0-9]+).[a-zA-Z0-9]*.[a-z]3.?([a-z]+)?$
DEMO
【讨论】:
更简单的^(https?:\/\/)?(www.)?([a-zA-Z0-9]+).[a-zA-Z0-9]*.[a-z]3.?([a-z]+)?$
正确的是^(http:\/\/|https:\/\/)?(www.)?([a-zA-Z0-9]+).[a-zA-Z0-9]*.[a-z]3\.([a-z]+)?$
这个正则表达式不接受斜杠,例如。 https://www.google.com/123
。它也不接受多个键值对,例如:https://www.google.com?key1=value1&&key2=value2
。【参考方案2】:
@Avinash 答案的 Java 兼容版本是
//Pattern to check if this is a valid URL address
Pattern p = Pattern.compile("^(http://|https://)?(www.)?([a-zA-Z0-9]+).[a-zA-Z0-9]*.[a-z]3.?([a-z]+)?$");
Matcher m;
m=p.matcher(urlAddress);
boolean matches = m.matches();
【讨论】:
【参考方案3】:您可以使用 Apache 公共库 (org.apache.commons.validator.UrlValidator) 来验证 url:
String[] schemes = "http","https".
UrlValidator urlValidator = new UrlValidator(schemes);
并使用:-
urlValidator.isValid(your url)
那么就不需要正则表达式了。
链接:- https://commons.apache.org/proper/commons-validator/apidocs/org/apache/commons/validator/routines/UrlValidator.html
【讨论】:
如果有人尝试输入“http:\\”或“http:/”,您可能需要一个正则表达式来避免异常 此验证器不允许在主机名中使用下划线【参考方案4】:如果你使用Java,我推荐使用这个RegEx(我自己写的):
^(https?:\/\/)?(www\.)?([\w]+\.)+[\w]2,63\/?$
"^(https?:\\/\\/)?(www\.)?([\\w]+\\.)+[\\w]2,63\\/?$" // as Java-String
解释一下:
^ = 行开始 (https?://)? = "http://" 或 "https://" 可能会出现。 (万维网)? =“万维网”可能会发牢骚。 ([\w]+.)+ = 一个词 ([a-zA-Z0-9]) 必须出现一次或多次。 (如果您的 URL 中需要 ü、ä、ö 或其他特殊字符,请在此处扩展 - 如果您使用特殊字符,请记住使用 IDN.toASCII(url)。如果您需要知道哪些字符通常是合法的:https://kb.ucla.edu/articles/what-characters-can-go-into-a-valid-http-url [\w]2,63 = 包含 2 到 63 个字符的单词 ([a-zA-Z0-9]) 必须恰好出现一次。 (TLD(***域(例如 .com)不能短于 2 个或超过 63 个字符) /? = 可能出现“/”字符。 (有些人或服务器把 / 放在最后......随便) $ = 行尾-
如果你用特殊字符扩展它,它可能看起来像这样:
^(https?:\/\/)?(www\.)?([\w\Q$-_+!*'(),%\E]+\.)+[\w]2,63\/?$
"^(https?:\\/\\/)?(www\.)?([\\w\\Q$-_+!*'(),%\\E]+\\.)+[\\w]2,63\\/?$" // as Java-String
Avinash Raj 的答案并不完全正确。
^(http:\/\/|https:\/\/)?(www.)?([a-zA-Z0-9]+).[a-zA-Z0-9]*.[a-z]3.?([a-z]+)?$
点没有转义,这意味着它与任何字符匹配。另外我的版本更简单,我从未听说过像“test..com”这样的域(实际上匹配......)
演示:https://regex101.com/r/vM7wT6/279
编辑: 当我看到有些人需要一个也匹配服务器目录的正则表达式时,我写了这个:
^(https?:\/\/)?([\w\Q$-_+!*'(),%\E]+\.)+(\w2,63)(:\d1,4)?([\w\Q/$-_+!*'(),%\E]+\.?[\w])*\/?$
虽然这可能不是最好的,因为我没有花太多时间在它上面,也许它可以帮助某人。你可以在这里看到它是如何工作的:https://regex101.com/r/vM7wT6/700 它还匹配诸如“hello.to/test/whatever.cgi”之类的网址
【讨论】:
【参考方案5】:pattern="w3\.[a-z]+\.?[a-z]2,3(|\.[a-z]2,3)"
这将只接受诸如 www.google.com 和 www.google.co.in 之类的地址
【讨论】:
【参考方案6】://我用那个
static boolean esURL(String cadena)
boolean bandera = false;
bandera = cadena.matches("\\b(https://?|ftp://|file://|www.)[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]");
return bandera;
【讨论】:
以上是关于JAVA 中的网站/URL 验证正则表达式的主要内容,如果未能解决你的问题,请参考以下文章