我正在尝试构建一个正则表达式,它接受具有以下条件的域名:
- 允许最多 255 个字符的 DNS 名称(仅允许使用连字符、句点和字母数字字符(。
- 连字符只能出现在字母之间 应以字母
- 开头,以字母结尾。它至少包含 3 个字符(字母和句点为必填项,连字符为可选项。
- 句点前标签的长度应为 63
可能的情况:
- A.B.C
- A-A.B
不应通过的案例
- a-.b
- qwertqwertqwertqwertqwerhhg.v
- AAAA
- AAA-A
我构建的内容如下所示:
^(([a-zA-z0-9][A-Z0-9a-z-]{1,61}[a-zA-Z0-9][.])+[a-zA-Z0-9]+)$
但这不接受 a.b.c
您可以使用
^(?=.{1,255}$)(?=[^.]{1,63}(?![^.]))[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*(?:[.](?=[^.]{1,63}(?![^.]))[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)+(?:[.][a-zA-Z0-9-]*[a-zA-Z0-9])?$
在此处查看正则表达式演示。
图案详细信息
^
- 字符串的开头(?=.{1,255}$)
- 整个字符串应包含 1 到 255 个字符(?=[^.]{1,63}(?![^.]))
- 在.
或字符串末尾以外的字符之前,必须有 1 到 63
个字符,而不是[a-zA-Z0-9]+
- 1 个或多个字母数字字符(?:
- 非捕获组的开始:-
- 连字符[a-zA-Z0-9]+
- 1+ 字母数字字符
)*
- 零次或多次重复(?:
- 非捕获组的开始...[.]
- 一个点(?=[^.]{1,63}(?![^.]))
- 在字符串.
或字符串末尾的字符之前,必须有 1 到 63
个字符,而不是[a-zA-Z0-9]+
- 1+ 字母数字字符(?:-[a-zA-Z0-9]+)*
- 0 次或多次重复-
后跟 1+ 字母数字字符
.
)+
-...1 次或更多次(?:
- 非捕获组的开始...[.]
- 一个点[a-zA-Z0-9-]*
- 1+ 字母数字或-
个字符[a-zA-Z0-9]
- 字母数字字符(末尾没有连字符(
)?
-...1 或 0 次(可选($
- 字符串的结尾。
.
您可以使用以下正则表达式:
/^(?=[A-Z])((?:[A-Zd]|(?<=[A-Z])-(?=[A-Z])){1,63})(?<=[A-Z])(?:.[A-Zd]+){1,2}$/im
详:
^
- 字符串的开头。(?=[A-Z])
- 积极的展望:整个字符串必须以字母开头。(
- 捕获组 - 域名。(?:
- 非捕获组的开始,由于以下量词而需要。[A-Zd]
- 第一种选择:字母或数字。|
- 或。(?<=[A-Z])-(?=[A-Z])
- 第二种选择:连字符,前面有一个字母 然后写了一封信。)
- 非捕获组的结束。{1,63}
- 此组(任一备选方案(必须最多出现 63 次。
)
- 捕获组结束。(?<=[A-Z])
- 正面外观:捕获组刚刚匹配(域名( 必须以字母结尾。(?:
- 非捕获组,由于以下量词也需要。.[A-Zd]+
- 一个点和一个字母或数字序列。
)
- 非捕获组的结束。{1,2}
- 此组必须出现 1 或 2 次。$
- 字符串的结尾。
您绝对应该使用i
(不区分大小写(选项,如果您检查 许多字符串,每个字符串在单独的行中,也m
(多行(选项。
我没有包括整个长度的任何测试,但你也没有包括它。 我认为,这里的主要任务是展示如何匹配您的正则表达式失败的情况。