正则表达式之间的区别

时间:2014-09-17 10:46:54

标签: regex

有人可以解释以下正则表达式之间的区别:

^([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]

而不是上面用交替运算符显示的两个?

3 个答案:

答案 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]|之前的部分),则不允许使用单个字符。