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 验证正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Java中完美的URL验证正则表达式

Java验证正则表达式

JAVA中的正则表达式简介

iPhone中url的正则表达式

java中的正则表达式问题 怎么验证密码必须由字母 数字或下划线开头,密码可以随便组合

用正则表达式提取网址中的IP怎样取?