需要帮助为特定规则创建正则表达式

时间:2012-01-23 21:12:21

标签: .net regex

我有以下几乎所有我需要的正则表达式:

^[a-z0-9][a-z0-9][a-z0-9]{2,62}$

我需要的是支持以下规则:

  

每个短划线( - )字符必须紧跟在字母或数字之后;不允许连续短划线。

供参考,以下是此正则表达式必须支持的所有规则:

  
      
  1. 必须以字母或数字开头,并且只能包含字母,数字和短划线( - )字符。

  2.   
  3. 每个短划线( - )字符必须紧跟在字母或数字之后;不允许连续短划线。

  4.   
  5. 所有字母必须小写。

  6.   
  7. 长度必须为3到63个字符。

  8.   

3 个答案:

答案 0 :(得分:3)

这应符合您的前三个要求:

^[a-z0-9]+(-[a-z0-9]+)*$

如果支持,最后一个要求可以通过额外的正则表达式或先行断言来满足:

^(?=.{3,63}$)[a-z0-9]+(-[a-z0-9]+)*$

答案 1 :(得分:1)

这将为您提供所需的结果

^(?-i)(?:[a-z0-9]|(?<=[0-9a-z])-(?=[0-9a-z])){3,63}$

^匹配字符串的开头

(?-i)不区分大小写

(?:开始非捕获组

[a-z0-9]匹配a-z或0-9

|

(?<=[0-9a-z])-(?=[0-9a-z])匹配-只要其前面和超过a-z或0-9                                    这使用了后面看并向前看

)关闭非捕获组

{3,63}重复3到63次

$匹配字符串

的结尾

答案 2 :(得分:0)

这似乎是你正在寻找的,除了长度:

^([a-z0-9]|[a-z0-9]-[a-z0-9])+$

你不能把长度放在那里,因为尽管长度为3,序列a-a(允许)将被视为一次重复。

如果你可以否定比赛,那么你可以做这样的事情(添加空格和换行符以便于阅读,想想perl&#39; /x旗帜)

# reject if...
[^a-z0-9]      # any character other than a-z0-9
| (^.{64})     # has a 64th character
| (^.{0,2}$)   # is 0–2 characters
| (--)         # consecutive dashes 
| (^-)         # starts with dash
| (-$)         # ends with dash

无法保证比赛的效率。