有人可以解释以下正则表达式之间的区别:
^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$
和
^([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$`
为什么我们不能使用单个组:
[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]
而不是上面用交替运算符显示的两个?
答案 0 :(得分:2)
让我们看得更加明显:
^
(
[a-zA-Z0-9]| # Regex 1 only - matches 1 alnum character
[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9] # Matches 2-63 characters
)
(
\.
(
[a-zA-Z0-9]| # Regex 1 only
[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]
)
)*
$
随着交替,
a.a
匹配
没有它,它没有,因为在点之前和之后至少需要两个字母/数字。
答案 1 :(得分:2)
正如其他人所说,第一个正则表达式允许在点之前使用单个字符。第二个正则表达式需要两个。
要在保留语义的同时避免交替,您需要将第一部分重写为:
[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?
那就是你需要[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]
可选。
答案 2 :(得分:1)
([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])
^ | ^
| -----------------| |
Allows exactly one character or atleast two characters.
如果没有第一个[a-zA-Z0-9]
(|
之前的部分),则不允许使用单个字符。