域名正则表达式示例

域名

域名正则表达式模式

^((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,6}$

上述模式可确保域名符合以下条件:

  1. 域名应该是az | AZ | 0-9和连字符(-)
  2. 域名长度应在1到63个字符之间
  3. 最后一个Tld必须至少两个字符,最多6个字符
  4. 域名不得以连字符(-)开头或结尾(例如-google.com或google-.com)
  5. 域名可以是子域名(例如mkyong.blogspot.com)

描述

^			    #Start of the line
 (			    #Start of group #1
	(?! -)		    #Can't start with a hyphen
	[A-Za-z0-9-]{1,63}  #Domain name is [A-Za-z0-9-], between 1 and 63 long
	(?<!-)		    #Can't end with hyphen
	\\.		    #Follow by a dot "."
 )+			    #End of group #1, this group must appear at least 1 time, but allowed multiple times for subdomain 
 [A-Za-z]{2,6}		    #TLD is [A-Za-z], between 2 and 6 long
$			    #end of the line

注意
这种正则表达式模式应该能够匹配大多数“实际使用”的域名。

有效域名列表

  1. www.google.com
  2. google.com
  3. mkyong123.com
  4. mkyong-info.com
  5. sub.mkyong.com
  6. sub.mkyong-info.com
  7. mkyong.com.au
  8. g.co
  9. mkyong.ttco

无效域名列表,以及原因。

  1. mkyong.ttc – Tld必须介于2到6之间
  2. mkyong,com –不允许使用逗号
  3. mkyong –无Tld
  4. mkyong.123,TLD不允许数字
  5. .com –必须以[A-Za-z0-9]开头
  6. mkyong.com/users – No Tld
  7. -mkyong.com –不能以连字符开头–
  8. mkyong-.com –不能以连字符结尾–
  9. sub.-mkyong.com –不能以连字符开头–
  10. sub.mkyong-.com –不能以连字符结尾–

1. Java正则表达式示例

一个简单的Java示例,可以使用上述正则表达式模式来验证域名。

DomainUtils.java
package com.mkyong.regex;

import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DomainUtils {

	private static Pattern pDomainNameOnly;
	private static final String DOMAIN_NAME_PATTERN = "^((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,6}$";
	
	static {
		pDomainNameOnly = Pattern.compile(DOMAIN_NAME_PATTERN);
	}

	public static boolean isValidDomainName(String domainName) {
		return pDomainNameOnly.matcher(domainName).find();
	}

}

2.使用jUnit进行单元测试

一个jUnit示例。

DomainUtilsTestParam.java
package com.mkyong.regex;

import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(value = Parameterized.class)
public class DomainUtilsTestParam {

	private String domain;
	private boolean expected;

	public DomainUtilsTestParam(String domain, boolean expected) {
		this.domain = domain;
		this.expected = expected;
	}

	@Parameters(name= "{index}: isValid({0})={1}")
 	public static Iterable<Object[]> data() {
 		return Arrays.asList(new Object[][] { 
 		{ "www.google.com", true }, 
 		{ "google.com", true },
 		{ "mkyong123.com", true }, 
 		{ "mkyong-info.com", true }, 
 		{ "sub.mkyong.com", true },
                { "sub.mkyong-info.com", true }, 
                { "mkyong.com.au", true }, 
                { "sub.mkyong.com", true }, 
                { "sub.sub.mkyong.com", true }, 
                { "g.co", true },
                { "mkyong.t.t.co", true },	
                { "mkyong.t.t.c", false },      //Tld must at between 2 and 6 long
                { "mkyong,com", false }, 	//comma not allowed
                { "mkyong", false }, 		//no tld
                { "mkyong.123", false },	//digit not allowed in tld
                { ".com", false }, 		//must start with [A-Za-z0-9]
                { "mkyong.a", false },		//last tld need at least two characters
                { "mkyong.com/users", false },	// no tld
                { "-mkyong.com", false },	//Cannot begin with a hyphen -
                { "mkyong-.com", false },	//Cannot end with a hyphen -
                { "sub.-mkyong.com", false },	//Cannot begin with a hyphen -
                { "sub.mkyong-.com", false }	//Cannot end with a hyphen -
            }
 	);
     }

    @Test
    public void test_validDomains() {
	assertEquals(expected,DomainUtils.isValidDomainName(domain));
    }

}

输出,全部通过。

域正则表达式

4.使用TestNG进行单元测试

一个TestNG示例。

DomainUtilsTestParam.java
package com.mkyong.regex;

import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class DomainUtilsTestParam {

	@DataProvider
	public Object[][] ValidDomainNameProvider() {
	  return new Object[][] {{ 
			   new String[] { 
		"www.google.com", "google.com",
		"mkyong123.com", "mkyong-info.com", 
		"sub.mkyong.com","sub.mkyong-info.com", 
		"mkyong.com.au", "sub.mkyong.com",
		"sub.sub.mkyong.com", "g.co", "mkyong.t.t.co" } } };
	}

	@DataProvider
	public Object[][] InvalidDomainNameProvider() {
	  return new Object[][] { { new String[] { 
		"mkyong.t.t.c", "mkyong,com",
		"mkyong", "mkyong.123", 
		".com", "mkyong.a",
		"mkyong.com/users", "-mkyong.com", 
		"mkyong-.com",".com", "sub.-mkyong.com", "sub.mkyong-.com"} } };
	}
	
	@Test(dataProvider = "ValidDomainNameProvider")
	public void ValidDomainNameTest(String[] domainName) {

		for (String temp : domainName) {
			boolean valid = DomainUtils.isValidDomainName(temp);
			System.out.println("Valid domain name : " + temp);
			Assert.assertEquals(valid, true);
		}

	}

	@Test(dataProvider = "InvalidDomainNameProvider", 
              dependsOnMethods = "ValidDomainNameTest")
	public void InValidDomainNameTest(String[] domainName) {

		for (String temp : domainName) {
			boolean valid = DomainUtils.isValidDomainName(temp);
			System.out.println("Invalid domain name : " + temp);
			Assert.assertEquals(valid, false);
		}
	}

}

结果

Valid domain name : www.google.com
Valid domain name : google.com
Valid domain name : mkyong123.com
Valid domain name : mkyong-info.com
Valid domain name : sub.mkyong.com
Valid domain name : sub.mkyong-info.com
Valid domain name : mkyong.com.au
Valid domain name : sub.mkyong.com
Valid domain name : sub.sub.mkyong.com
Valid domain name : g.co
Valid domain name : mkyong.t.t.co
Invalid domain name : mkyong.t.t.c
Invalid domain name : mkyong,com
Invalid domain name : mkyong
Invalid domain name : mkyong.123
Invalid domain name : .com
Invalid domain name : mkyong.a
Invalid domain name : mkyong.com/users
Invalid domain name : -mkyong.com
Invalid domain name : mkyong-.com
Invalid domain name : .com
Invalid domain name : sub.-mkyong.com
Invalid domain name : sub.mkyong-.com
PASSED: ValidDomainNameTest([Ljava.lang.String;@4661e987)
PASSED: InValidDomainNameTest([Ljava.lang.String;@117b8cf0)

===============================================
    Default test
    Tests run: 2, Failures: 0, Skips: 0
===============================================

参考文献

  1. RegEx –环顾四周的断言
  2. 维基百科– Internet顶级域名列表
  3. 维基百科–顶级域名
  4. 维基百科-正则表达式

翻译自: https://mkyong.com/regular-expressions/domain-name-regular-expression-example/

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值