正向前瞻字符必须只出现一次并且是可选的

时间:2016-12-26 10:45:44

标签: regex

^(?=.*[-_.]?)[a-z][a-z0-9-_.]{1,13}[a-z0-9]$
  • 必须以字母开头。
  • 必须以字母或数字结尾。
  • 长度必须介于3到15个字符之间。
  • 可能只存在字母,数字和[-_.]
  • [-_.]是可选的,但在使用时只能在整个字符串中出现ONCE。

我在最后一个要点上遇到了麻烦。

尝试使用(?=.*[-_.]?)进行预测并确保每当使用[-_.]时,它应该只发生一次。但它似乎不起作用,因为当我使用类似a__-bc34a.b_c-d的字符串进行测试时,它匹配,但它应该只允许a_bc34之类的内容。

高级正则表达不是我最强的,所以我很感激任何帮助!

2 个答案:

答案 0 :(得分:5)

I'do:

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

<强>解释

^               : start of string
(?=.{3,15}$)    : lookahead, assumes there is from 3 to 15 character
[a-z]           : a letter
[a-z0-9]*       : 0 or more alphanum
[-_.]?          : optional -, _ or .
[a-z0-9]+       : 1 or more alphanum
$               : end of string

答案 1 :(得分:2)

试试这个:

^(?!([^-_.]*[-_.]){2})[a-z][\w.-]{1,13}[a-z0-9]$

&#34;可选但最多一次&#34;在逻辑上等同于&#34;不是两次&#34;,(?!([^-_.]*[-_.]){2})就是这个。

其余的是您的表达,但使用\w进行了简化,与[a-zA-Z0-9_]相同。

此外,将这样的限制放在预测中意味着您可以通过添加更多的前瞻功能轻松添加更多此类限制。这比将需求烘焙到核心表达式更好。