首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中根据RFC 1035标准检查域名

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

Stack Overflow用户
提问于 2019-07-01 20:18:00
回答 1查看 763关注 0票数 1

我正在尝试写代码来检查域名是否符合RFC1035标准。RFC1035(https://www.rfc-editor.org/rfc/rfc1035)标准对域名有以下标准:

代码语言:javascript
复制
<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写了下面的代码片段,用来检查域名是否符合RFC1035的规定。

代码语言:javascript
复制
//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(" "));
   }

}

代码语言:javascript
复制
//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);
   }

}

我只是想检查是否有一些有效的方法(除了我写的)来检查域名是否对RFC1035标准有效?此外,如果我需要检查我的代码工作的角落情况下的RFC1035标准,那么我可以在哪里检查。是否有一些现成的库可以用于此检查?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-04 15:26:19

试试这个:

代码语言:javascript
复制
^[a-zA-Z]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*$

如下面的demo所示

要构造此表达式,我们首先使用标签组件( set a-zA-Z中的单个字符,后面(可选)是set a-zA-Z0-9-中的一系列字符,并以一个非-结尾(允许在标签内部使用连字符,但不允许在标签的开头或结尾),从而导致

代码语言:javascript
复制
[a-zA-Z]([a-zA-Z0-9-]*[a-zA-Z0-9])?

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

代码语言:javascript
复制
A(\.A)*

这意味着一个A序列,后面是任意数量(甚至是0)的点序列,后面是A的另一个实例。

通过用上面的reges替换A的位置,我们得到了最终的regexp。锚点消除了字符串开头/结尾的任何其他周围字符串。

要检查标签是否最多包含63个字符,您可以执行以下操作

代码语言:javascript
复制
[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?

但是要当心,因为这个正则表达式会编译成一个非常大的表自动机(一个具有多个状态的自动机),所以如果空间不足,最好放松一下。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56835571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档