5

regex以下に一致する必要があるユーザー名を検証するために を作成しようとしています:

  • 許可される特殊文字は 1 つだけ(._-)であり、文字列の極値であってはなりません
  • 最初の文字を数字にすることはできません
  • 許可されている他のすべての文字は、文字と数字です
  • 全長は 3~20 文字である必要があります

これは HTML5 検証パターン用なので、残念ながら 1 つの大きな正規表現でなければなりません。

これまでのところ、これは私が持っているものです:

^(?=(?![0-9])[A-Za-z0-9]+[._-]?[A-Za-z0-9]+).{3,20}

しかし、正の先読みは複数回繰り返すことができ、私が望んでいたものではない複数の特殊文字を許可します。そして、それを修正する方法がわかりません。

4

2 に答える 2

16

作業を楽にするために、正規表現を 2 つの部分 (2 つの式ではなく!) に分割する必要があります。

まず、ユーザー名に必要な形式を一致させます。 ^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$

ここで、長さの制約を検証する必要があります。既に見つかったパターンをいじらないようにするために、文字数のみを検証する消費しない一致を使用できます (これは文字通り、正規表現のandパターンを作成するためのハックです)。(?=^.{3,20}$)

長さの制約が一致する場合にのみ、正規表現は有効な形式に一致しようとします。これは非消費であるため、成功した後もエンジンは文字列の先頭にあります。

だから、一緒に:

 (?=^.{3,20}$)^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$

正規表現の視覚化

デバッガのデモ

于 2015-02-08T10:52:40.463 に答える
0

?の代わりに使用する必要があると思う+ので、特殊文字は1回だけ一致するかどうか。

^(?=(?![0-9])?[A-Za-z0-9]?[._-]?[A-Za-z0-9]+).{3,20}

于 2015-02-08T10:46:54.730 に答える