JAVA中的网站/URL验证正则表达式

7

我需要一个正则表达式字符串来匹配以"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必须以以下任意一种方式开头:"http://" "https://" "www." "google.com"吗? - Scary Wombat
不,不仅仅是谷歌网站。google.com只是没有在其URL中包含“www。”或任何“http或https”的网站的一个例子。 - Hao Ting
6个回答

20

您需要将正则表达式中的(http://|https://)部分设置为可选项。

^(http:\/\/|https:\/\/)?(www.)?([a-zA-Z0-9]+).[a-zA-Z0-9]*.[a-z]{3}.?([a-z]+)?$

演示


1
更加简单的正则表达式:^(https?:\/\/)?(www.)?([a-zA-Z0-9]+).[a-zA-Z0-9]*.[a-z]{3}.?([a-z]+)?$ - Avinash Raj
5
正确的是 ^(http:\/\/|https:\/\/)?(www.)?([a-zA-Z0-9]+)\.[a-zA-Z0-9]*\.[a-z]{3}\.([a-z]+)?$ - Ananda
3
这个正则表达式不接受斜杠,例如:https://www.google.com/123。 它也不接受多个键值对,例如:https://www.google.com?key1=value1&&key2=value2 - Akash Tomar

11

如果有人尝试输入“http:\”或“http:/”,您可能需要使用正则表达式来避免异常。 - Chargnn
1
此验证器不允许在主机名中使用下划线。 - Udit Kumawat

9
如果您使用Java,我建议使用这个正则表达式(我自己编写的):
^(https?:\/\/)?(www\.)?([\w]+\.)+[‌​\w]{2,63}\/?$
"^(https?:\\/\\/)?(www\.)?([\\w]+\\.)+[‌​\\w]{2,63}\\/?$" // as Java-String

解释如下:

  • ^ = 行首
  • (https?://)? = 可能出现 "http://" 或 "https://"
  • (www.)? = 可能出现 "www."
  • ([\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} = 必须出现一个单词 ([a-zA-Z0-9]),长度为 2 到 63 个字符(顶级域名(例如 .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]+\.)+(\w{2,63})(:\d{1,4})?([\w\Q/$-_+!*'(),%\E]+\.?[\w])*\/?$

虽然这可能不是最好的方法,因为我没有太多时间去研究,但它或许可以帮助一些人。你可以在这里查看它的工作方式:https://regex101.com/r/vM7wT6/700。 它还可以匹配像“hello.to/test/whatever.cgi”这样的URL。


3

@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();

1
pattern="w{3}\.[a-z]+\.?[a-z]{2,3}(|\.[a-z]{2,3})"

这将只接受像 www.google.com 和 www.google.co.in 这样的地址。


-1

//我使用它

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接