2016-12-26 11 views
3
^(?=.*[-_.]?)[a-z][a-z0-9-_.]{1,13}[a-z0-9]$ 
  • オプションである必要があります。
  • 文字または数字で終わらなければなりません。
  • 3文字以上15文字以下である必要があります。
  • 文字、数字および[-_.]のみ存在することがあります。
  • [-_.]はオプションですが、使用する場合は、文字列全体で1回だけ使用する必要があります。

最後の箇条書きに問題があります。肯定先読み文字は一度だけ発生し、文字で始まる必要があり

(?=.*[-_.]?)で先読みしてみて、[-_.]を使用すると必ず1回発生するようにしてください。しかし、それはa__-bc34またはa.b_c-dのような文字列でテストすると一致しますが、それはa_bc34のようなものだけを許可する必要があるため、動作していないようです。

高度な正規表現は私の最強のものではありません。何か助けていただければ幸いです!

+1

'[-_。]'これは私のために働いたが、私は」 –

答えて

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]$ 

"一度オプションですが、max" は、 "二度ではない" と論理的に等価である、と(?!([^-_.]*[-_.]){2})はちょうどそれを意味します。

残りは式ですが、\wを使用すると簡略化され、[a-zA-Z0-9_]と同じです。

また、このような制限を見越しておくと、より多くのルックアヘッドを追加するだけで、このような制限を簡単に追加できます。これは、要件をコア表現に焼くよりも好ましい方法です。

+2

@RomanPerekhrestあなたの例では3回使用されていますそれはいくつかの説明を提供するので、トートの答えを選択します。 –

+0

@kid説明が追加されました。 – Bohemian

関連する問題