正则表达式匹配带或不带http和https的主机;

时间:2013-03-07 12:01:25

标签: java regex

我是Java的初学者,我一直试图找出与以下内容匹配的正则表达式:

  1. 仅限主机而非IP
  2. 主机也可能带有http或https标签。
  3. 主持人可以拥有不同的TLD。
  4. 我试过[a-z0-9]+|([a-z0-9]+[-]+[a-z0-9]+))[.])+,但我得不到我的预期。 如果有人可以帮助我,那将是很棒的。

2 个答案:

答案 0 :(得分:2)

public static void main(String[] args) {
Pattern pattern = Pattern.compile ("(?:https?://)?(?:[-a-zA-Z0-9_]+\\.)*[-a-zA-Z0-9_]*[-a-zA-Z_][-a-zA-Z0-9_]*(?:\\.[-a-zA-Z0-9_]+)*");

System.out.println(pattern.matcher("127.0.0.1").matches()); // false
System.out.println(pattern.matcher("1.0.0.127.in-addr.arpa").matches()); // true
System.out.println(pattern.matcher("localhost").matches()); // true
System.out.println(pattern.matcher("1-2-3-4").matches()); // true
System.out.println(pattern.matcher("http://1.0.0.127").matches()); // false
System.out.println(pattern.matcher("https://1.0.0.127").matches()); // false
System.out.println(pattern.matcher("ftp://1.0.0.127.in-addr.arpa").matches()); // false
System.out.println(pattern.matcher("http://1.0.0.127.in-addr.arpa").matches()); // true
System.out.println(pattern.matcher("https://1.0.0.127.in-addr.arpa").matches()); // true

答案 1 :(得分:0)

不确定您要完成的任务。您需要主机部分,但只需要已解析的部分,即不允许使用IP地址。你为什么想要它?那么可选的端口号呢?那些可能的登录信息呢?我的建议是使用java.net.URL(或URI)对象,如果你想对解析的数据做任何严肃的事情。

如果您只想使用正则表达式,请更好地指定您的要求,因为根据输入文本,没有正则表达式可能就足够了。请考虑以下输入:

Lorem ipsum.Dolor sit amen

ipsum.Dolor是否应被接受为有效主机?它没有http://协议规范,也不是IP地址,因此根据您的要求,它应该匹配。