2011-07-18 17 views
6

文字列に少なくともn個の異なるクラスの文字が含まれている場合にのみ一致する正規表現を作成しようとしていました。私は、強力なパスワードを作成するために私のユーザーを強制的にこれを使用しようとパスワードは、以下の少なくとも3が含まれているかどうかを確認したかった。少なくともn個のmグループに一致する正規表現

  • 文字
  • 資本文字が
  • 番号
  • 特殊文字

これらのクラスがすべて存在する場合に一致する正規表現を書くことは、先読みを使って簡単です。しかし、私は "少なくとも3"の部分の周りに私の頭を包むことはできません。これは(素晴らしい、コンパクトな表現で)可能なのですか?または私はモンスターの表現を作成する必要がありますか?

答えて

6

私はそれは文字列全体が1つまたは2つだけあなたが記載されている文字クラスの構成されていないことを確認するために、負の先読みを利用し、これは4の3のそれぞれの可能な組み合わせをリストよりもコンパクトになると思う。

(?!([a-zA-Z]*|[a-z\d]*|[^A-Z\d]*|[A-Z\d]*|[^a-z\d]*|[^a-zA-Z]*)$).* 

順に、ここで基は:

  • 下部及び/又は上部
  • 下及び/または数字
  • 下及び/ O rは特別
  • 上部及び/または数字
  • 上部及び/又は特殊
  • 数字及び/又は特殊

この正規表現が失敗する場合は、文字列全体(ための負の先読みで$)上記のいずれかのグループの文字のみが含まれています。

+1

私はこのアプローチが本当に好きです。論理を反転することについても考えなかった。ありがとう、非常に賢い! –

+1

この式ではスペースが許されていませんか? – Rookian

+1

それは、[パスワードがスペースを許可するのは珍しいことではありません](http://stackoverflow.com/questions/632167/should-users-be-allowed-to-entered-a-password-with-a-space- at-the-beginning-or-e)である。スペースを許さないバージョンが必要な場合は、最後の '。*'を '\ S *'に変更してください。 –

2

4つのうち3つ(合計4つの式)の可能な組み合わせごとに式を書いてから、|個々の表現が一緒になって、元の表現の少なくとも1つを満たす場合に合格する。

+1

あなたの現在の正規表現の長さの3/4にそれぞれ4つの式があるので、最終結果は現在の正規表現の約3倍になります。悪くない。 – Paulpro

+0

私はそれをしなくてもいいと思った。私はそれがきれいではないと思います、特に同じクラスを何度も何度も書き直さなければならないからです。あなたの説明のためにありがとうございました。 –

+0

なぜきれいではありませんか?そのメソッドを作成して再利用するメソッドを作成します。 1つの巨大なRegExを読み取ることよりもずっと優れています。 –

0

このソリューションについてどう思いますか?

var str='23khkS_s'; 

var countGroups=0; 
if(str.match(/[a-z]+/)) 
    countGroups++; 
if(str.match(/[A-Z]+/)) 
    countGroups++; 
if(str.match(/[0-9]+/)) 
    countGroups++; 
if(str.match(/[[email protected]#$%*\(\)]+/)) 
    countGroups++; 

console.log(countGroups); 

代わりに1モンスターのような表現を使用してのあなたは、4つの小さなREを使用することができます。次に、可変数の文字グループを含む変数countGroupsを使用します。 私はそれが役に立ちそうです

+0

これは、彼がソリューション全体の終わりから終わりまでを制御していれば良いでしょうが、彼ができることは、正規表現をテキストフィールドに入れて設定することができると思われます。 –

関連する問題