2016-12-26 59 views
3
^(?=.*[-_.]?)[a-z][a-z0-9-_.]{1,13}[a-z0-9]$ 
  • 必須以字母開頭。
  • 必須以字母或數字結尾。
  • 長度必須在3到15個字符之間。
  • 可能只存在字母,數字和[-_.]
  • [-_.]是可選的,但使用時只能在整個字符串中出現一次。

我遇到了最後一個問題。積極的lookahead字符必須只出現一次,是可選

試着用(?=.*[-_.]?)向前看,並確保每當使用[-_.]時,它應該只發生一次。但它似乎並沒有工作,因爲當我測試它與a__-bc34a.b_c-d這樣的字符串它匹配,但它應該只允許像a_bc34

先進的正則表達式不是我最強大的,所以我會很感激任何幫助!

+1

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

回答

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 
2

試試這個:

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

「可選的,但一旦最大」在邏輯上等同於「不是兩次」,並且(?!([^-_.]*[-_.]){2})意味着這一點。

其餘的是你的表情,但通過使用\w簡化,這與[a-zA-Z0-9_]相同。

此外,將這種限制放在前面意味着您可以通過添加更多前瞻來輕鬆添加更多此類限制。這比將要求烘焙成核心表達更可取。

+2

這爲我工作使用三次,但我m選擇Toto的答案,因爲它提供了一些解釋。 –

+0

@kid解釋添加。 – Bohemian