Пример регулярного выражения доменного имени

Шаблон регулярного выражения доменного имени
^((?!-)[A-Za-z0-9-]{1,63}(?
Приведенный выше шаблон гарантирует, что доменное имя соответствует следующим критериям:
-
Имя домена должно быть a-z | А-Я | 0-9 и дефис (-)
-
Имя домена должно содержать от 1 до 63 символов.
-
Последний Tld должен состоять как минимум из двух символов и максимум из 6 символов.
-
Имя домена не должно начинаться или заканчиваться дефисом (-) (например, -google.com or google-.com)
-
Доменное имя может быть субдоменом (например, example.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
(?
Note
Этот шаблон регулярного выражения должен соответствовать большинству «реально работающих» доменных имен.
Список действующих доменных имен
-
www.google.com
-
google.com
-
example123.com
-
example-info.com
-
sub.example.com
-
sub.example-info.com
-
example.com.au
-
g.co
-
example.t.t.co
Список недействительных доменных имен и почему.
-
example.t.t.c - Tld must between 2 and 6 long
-
например, com - Запятая не разрешена
-
пример - Нет Tld
-
example.123 , Tld not allow digit
-
.com - должен начинаться с [A-Za-z0-9]
-
example.com/users - No Tld
-
-example.com - Cannot begin with a hyphen -
-
example-.com - Cannot end with a hyphen -
-
sub.-example.com - не может начинаться с дефиса -
-
sub.example-.com - Cannot end with a hyphen -
1. Пример регулярного выражения Java
Простой пример Java для проверки доменного имени с указанным выше шаблоном регулярных выражений.
DomainUtils.java
package com.example.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}(?
2. Модульный тест с jUnit
Пример jUnit.
DomainUtilsTestParam.java
package com.example.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
Выход, все прошло.

4. Модульный тест с TestNG
Пример TestNG.
DomainUtilsTestParam.java
package com.example.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",
"example123.com", "example-info.com",
"sub.example.com","sub.example-info.com",
"example.com.au", "sub.example.com",
"sub.sub.example.com", "g.co", "example.t.t.co" } } };
}
@DataProvider
public Object[][] InvalidDomainNameProvider() {
return new Object[][] { { new String[] {
"example.t.t.c", "example,com",
"example", "example.123",
".com", "example.a",
"example.com/users", "-example.com",
"example-.com",".com", "sub.-example.com", "sub.example-.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 : example123.com
Valid domain name : example-info.com
Valid domain name : sub.example.com
Valid domain name : sub.example-info.com
Valid domain name : example.com.au
Valid domain name : sub.example.com
Valid domain name : sub.sub.example.com
Valid domain name : g.co
Valid domain name : example.t.t.co
Invalid domain name : example.t.t.c
Invalid domain name : example,com
Invalid domain name : example
Invalid domain name : example.123
Invalid domain name : .com
Invalid domain name : example.a
Invalid domain name : example.com/users
Invalid domain name : -example.com
Invalid domain name : example-.com
Invalid domain name : .com
Invalid domain name : sub.-example.com
Invalid domain name : sub.example-.com
PASSED: ValidDomainNameTest([Ljava.lang.String;@4661e987)
PASSED: InValidDomainNameTest([Ljava.lang.String;@117b8cf0)
===============================================
Default test
Tests run: 2, Failures: 0, Skips: 0
===============================================
Рекомендации
-
http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains [Википедия
-
Список доменов верхнего уровня в Интернете]
-