根据Java中的RFC 1035标准检查域名

时间:2019-07-01 12:18:00

标签: regex domain-name rfc1035

我正在尝试编写代码以根据RFC 1035标准检查域名是否有效。 RFC 1035(https://tools.ietf.org/html/rfc1035)标准对域名具有以下标准:

<domain> ::= <subdomain> | " "

<subdomain> ::= <label> | <subdomain> "." <label>

<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]

<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>

<let-dig-hyp> ::= <let-dig> | "-"

<let-dig> ::= <letter> | <digit>

<letter> ::= any one of the 52 alphabetic characters A through Z in
upper case and a through z in lower case

<digit> ::= any one of the ten digits 0 through 9

Note that while upper and lower case letters are allowed in domain
names, no significance is attached to the case.  That is, two names with
the same spelling but different case are to be treated as if identical.

The labels must follow the rules for ARPANET host names.  They must
start with a letter, end with a letter or digit, and have as interior
characters only letters, digits, and hyphen.  There are also some
restrictions on the length.  Labels must be 63 characters or less.

我已经用Java编写了以下代码段,以根据rfc 1035检查域名是否有效。

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

class DomainUtils {

   private static Pattern pDomainNameOnly1;
   private static Pattern pDomainNameOnly2;

   private static final String DOMAIN_NAME_PATTERN_CHK_1 = "^(?![0-9-])[A-Za-z0-9-]{1,63}(?<!-)$";
   private static final String DOMAIN_NAME_PATTERN_CHK_2 = "^((?![0-9-])[A-Za-z0-9-]{1,63}(?<!-)\\.)+(?![0-9-])[A-Za-z0-9-]{1,63}(?<!-)$";

   static {
       pDomainNameOnly1 = Pattern.compile(DOMAIN_NAME_PATTERN_CHK_1);
       pDomainNameOnly2 = Pattern.compile(DOMAIN_NAME_PATTERN_CHK_2);
   }

   public static boolean isValidDomainName(String domainName) {
       return (pDomainNameOnly1.matcher(domainName).find() || pDomainNameOnly2.matcher(domainName).find() || domainName.equals(" "));
   }

}

//Main.java
public class Main{
   public static void main(String[] args){
       boolean valid = DomainUtils.isValidDomainName("a123456789a123456789a123456789a123456789a123456789a1234567891234.ARPA"); //check if domain name is valid or not
       System.out.println("Valid domain name : " + valid);
   }

}

我只是想检查是否有某种有效的方法(除了我写的以外)来检查域名是否符合rfc 1035标准?另外,如果我需要检查我的代码是否适用于RFC 1035标准的特殊情况,那么我可以在哪里检查。我可以使用一些现有的库进行检查吗?

1 个答案:

答案 0 :(得分:1)

尝试一下:

^[a-zA-Z]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*$

可以在此demo

中显示

要构造此表达式,我们首先使用标签组件(集合a-zA-Z中的单个字符,后跟(可选)集合a-zA-Z0-9-中的一系列字符,最后以非{ {1}}(允许在内部连字符,但不能在标签的开头或结尾)导致

-

此表达式以以下模式重复:

[a-zA-Z]([a-zA-Z0-9-]*[a-zA-Z0-9])?

表示A(\.A)* 的序列,后跟任意数量(偶数为0)的点序列,然后是A的另一个实例。

通过将以上注册表项替换为A的位置,我们得到最终的正则表达式。锚点消除了字符串开头/结尾的所有其他周围的字符串。

要检查标签最多只能包含63个字符,您可以

A

但是请注意,由于此正则表达式可编译为一个非常大的表自动机(具有许多状态的自动机),因此,如果空间不足,则最好放松一下。

相关问题