我正在尝试构建一个正则表达式,它接受具有以下条件的域名:
可能的案例:
不应传递的案件
我制作的内容如下:
^(([a-zA-z0-9][A-Z0-9a-z-]{1,61}[a-zA-Z0-9][.])+[a-zA-Z0-9]+)$
但这不接受a.b.c
答案 0 :(得分:2)
您可以使用
^(?=.{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])?$
请参阅regex demo here。
模式详情
^
- 字符串开头(?=.{1,255}$)
- 整个字符串应该有1到255个字符(?=[^.]{1,63}(?![^.]))
- 除.
以外的字符.
之外,字符串除<{1}}之外必须有1到63个字符[a-zA-Z0-9]+
- 一个或多个字母数字字符(?:
- 非捕获组的开始:
-
- 连字符[a-zA-Z0-9]+
- 1个字母数字字符)*
- 零次或多次重复(?:
- 非捕获组的开始......
[.]
- 一个点(?=[^.]{1,63}(?![^.]))
- 除.
以外的字符.
之外,字符串除<{1}}之外必须有1到63个字符[a-zA-Z0-9]+
- 1个字母数字字符(?:-[a-zA-Z0-9]+)*
- 重复-
次后加1个字母数字字符)+
-... 1次或多次(?:
- 非捕获组的开始......
[.]
- 一个点[a-zA-Z0-9-]*
- 1 +字母数字或-
字符[a-zA-Z0-9]
- 一个字母数字字符(最后没有连字符))?
-... 1或0次(可选)$
- 字符串结束。答案 1 :(得分:2)
您可以使用以下正则表达式:
/^(?=[A-Z])((?:[A-Z\d]|(?<=[A-Z])-(?=[A-Z])){1,63})(?<=[A-Z])(?:\.[A-Z\d]+){1,2}$/im
详细说明:
^
- 字符串的开头。(?=[A-Z])
- 正向前瞻:整个字符串必须以字母开头。(
- 捕获组 - 域名。
(?:
- 由于以下量词而需要启动非捕获组。[A-Z\d]
- 第一种选择:字母或数字。|
- 或。(?<=[A-Z])-(?=[A-Z])
- 第二种选择:连字符,前面有一个字母
然后是一封信。)
- 非捕获组的结束。{1,63}
- 此组(替代方案)必须最多出现63次。)
- 捕获组结束。(?<=[A-Z])
- 正面lookbehid:刚刚匹配的捕获组(域名)
必须以一封信结尾。(?:
- 由于以下量词,也需要非捕获组。
\.[A-Z\d]+
- 一个点和一系列字母或数字。)
- 非捕获组的结束。{1,2}
- 此组必须出现1次或2次。$
- 字符串的结尾。如果你检查,你肯定应该使用i
(不区分大小写)选项
许多字符串,每个字符串都在一个单独的行中,也是m
(多行)选项。
我没有对整个长度进行任何测试,但你也没有包括它。 我认为,这里的主要任务是展示如何匹配你的正则表达式失败的情况。