积极的lookahead字符必须只出现一次,是可选

问题描述:

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

我遇到了最后一个问题。积极的lookahead字符必须只出现一次,是可选

试着用(?=.*[-_.]?)向前看,并确保每当使用[-_.]时,它应该只发生一次。但它似乎并没有工作,因为当我测试它与a__-bc34a.b_c-d这样的字符串它匹配,但它应该只允许像a_bc34

先进的正则表达式不是我最强大的,所以我会很感激任何帮助!

+1

'[。-_]'在你的榜样@RomanPerekhrest –

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 

试试这个:

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

“可选的,但一旦最大”在逻辑上等同于“不是两次”,并且(?!([^-_.]*[-_.]){2})意味着这一点。

其余的是你的表情,但通过使用\w简化,这与[a-zA-Z0-9_]相同。

此外,将这种限制放在前面意味着您可以通过添加更多前瞻来轻松添加更多此类限制。这比将要求烘焙成核心表达更可取。

+2

这为我工作使用三次,但我m选择Toto的答案,因为它提供了一些解释。 –

+0

@kid解释添加。 – Bohemian