0

次の正規表現コードを使用しています。

^[a-z0-9_-]{3,15}$^

これをユーザー名の検証に使用しており、英数字、ピリオド-_およびピリオドと一致させたいと考えています。

次の奇妙なことが起こります。

これは一致しません:

bla.b

しかし、それはこれに一致します:

bla.blabla

両方に一致するように、これを変更するにはどうすればよいですか? 最小文字と最大文字を自由に変更できるようにしたいと思います。(ところで、この正規表現にはもっと間違ったことがあります。これは私が偶然発見したものです)

更新: CakePHP の検証でこれを使用していることに言及する必要があります。これにより、エラーが発生します。

^[a-z0-9_.-]{3,15}$

これはエラーです:

Warning (2): preg_match() [function.preg-match]: No ending delimiter '^' found
4

3 に答える 3

8

少し間違えて^、先頭に を付けるのを忘れました。別の区切り文字を選択すると、より見やすくなる場合があります。

^[a-z0-9_-]{3,15}$^    // your non-working version
^                 ^

/^[a-z0-9_-]{3,15}$/  // using / as delimiters instead, setting the beginning
 ^

覚えて:

  • ^ - 主題の始まりを示します
  • $ - 主題の終わりを示します

どちらもパターンの一部です。区切り文字は、パターンを修飾子から分離するために使用されます (ここでは修飾子は使用しません)。

または、最初と最後を and で示すこともでき\Aます\Z

ドットも一致させるには、文字クラスに追加します。

/^[a-z0-9_.-]{3,15}$/
          ^
于 2012-12-25T20:51:43.330 に答える
5
^[a-z0-9_-]{3,15}$^

次のようにする必要があります。

^[a-z0-9_-]{3,15}$

^は文字列の開始を示し、文字列$の終了を示します。

于 2012-12-25T20:51:41.363 に答える
1

これはそれを行う必要があります:

/^[a-z0-9_\.\-]{3,15}$/

ユーザー名を一致させたい場合、ドットで開始または終了することはおそらく望ましくありません。その場合、これを使用できます:

/^(?<!\.)[a-z0-9_\.\-]{3,15}(?!\.)$/

これは、その正規表現がどのように分解されるかです:

  1. ^「文字列の始まり」を意味します
  2. (?<!\.)ユーザー名がドットで始まらないことを確認します
  3. [a-z0-9\._-]{3,15}3 ~ 15 文字の英数字、ドット、アンダースコア、およびハイフンを意味します
  4. (?!\.)ユーザー名がドットで終わらないようにする
  5. $「文字列の終わり」を意味します

大文字を許可する場合は、正規表現をわずかに短縮できます。

/^(?<!\.)[\w\.\-]{3,15}(?!\.)$/

はの\w略で、単語文字[a-zA-Z0-9_]とも呼ばれます。

ユーザー名がドットで始まったり終わったりしないようにする別の方法は[]、次のように 3 つの連続した を使用することです。

/^[\w\-][\w\.\-]{1,13}[\w\-]$/

後読みと先読みをサポートしていないと私が信じているJavascriptで何かを一致させる必要がある場合に役立ちます。

于 2012-12-25T21:07:17.253 に答える