2012-08-02 101 views
4

我想匹配所有的字符串satifying以下规则 -正则表达式的字符串

  • 应包括较低情况下字母和数字和破折号
  • 应以字母或数字
  • 启动
  • 应该用字母或数字
  • 结束
  • 总串长度应ATLEAST 3个atmost 20个字符
  • .是选择有理,不应该有两个或更多的连续点.
  • 破折号-是可选的,不应该有两个或两个以上连续的破折号-
  • .和破折号-不应该是连续的//字符串aaa.-aaabbb无效
  • 下划线不允许

我想出了这个正则表达式:

^[a-z0-9]([a-z0-9]+\.?\-?[a-z0-9]+){1,18}[a-z0-9]$ 

[a-z0-9] //should start/end with a letter or a number 
([a-z0-9]+\.?\-?[a-z0-9]+){1,18} //other rules 

abcdefghijklmnopqrstuvwxyz //should fail total number of chars greater than 20 
aaa.-aaabbb //should fail as dot '.' and dash '-' are consecutive 

任何人都可以请帮我纠正这个表达式 -

然而,它像某些情况下失败的原因?

回答

3

您可以用lookahead assertion实现这一目标:

^(?!.*[.-]{2})[a-z0-9][a-z0-9.-]{1,18}[a-z0-9]$ 

说明:

^    # Start of string 
(?!    # Assert that the following can't be matched: 
.*    # Any number of characters 
[.-]{2}   # followed by .. or -- or .- or -. 
)    # End of lookahead 
[a-z0-9]   # Match lowercase letter/digit 
[a-z0-9.-]{1,18} # Match 1-18 of the allowed characters 
[a-z0-9]   # Match lowercase letter/digit 
$    # End of string 
+0

感谢您的快速回复和指针先行链接:-)很多添 – iniki 2012-08-02 12:21:44

1

我想出了这个它采用了negative lookahead类似于蒂姆的解决方案,但appying它以不同的方式。因为它只能看到一个点或一个短划线,所以它可能不需要做太多的事情,这可能会使其执行速度稍微快一点。

^[a-z0-9]([a-z0-9]|([-.](?![.-]))){1,18}[a-z0-9]$ 

说明:

^     # Start of string 
[a-z0-9]   # Must start with a letter or number 
(     # Begin Group 
    [a-z0-9]  # Match a letter or number 
    |    # OR 
    ([-.](?![.-])) # Match a dot or dash that is not followed by a dot or dash 
){1,18}   # Match group 1 to 18 times 
[a-z0-9]   # Must end with a letter or number 
$     # End of string