2011-01-19 16 views
0

以下の正規表現には大文字が必要です。私は、大文字はオプションではあるが必須ではないと言われました。少なくとも1つの大文字を必要としないように、他のパラメータを変更せずにこの正規表現を書く方法はありますか?少なくとも1つの大文字を必要としないこの正規表現が必要です

/^(?:(?!([a-zA-Z0-9-().&@?""#,+''\s\/])\1\1)[a-zA-Z0-9-().&@?""#,+''\s\/]){7,}$/ 
+2

**この**は、理解できない膨大な正規表現を書くのではなく、最も読みやすい解決法が得られる場合にのみ、少量で使用します。 – delnan

+0

この正規表現では、マッチする大文字は必要ありません(これは実際に少なくとも7文字の長さで、最初の3文字は同じではなく、[a-zA-Z0-9 - ()。&@? ""#、+ '' \ s \ /]) – Damp

答えて

4

正規表現にはすでに大文字は必要ありません。それが主張する唯一の「面白い」事柄は、同じことが3回繰り返される(同じ文字である)ことができず、全体の文字列が少なくとも7文字以上必要であることです。

また、正規表現内の一重引用符文字と二重引用符文字の倍数は必要ありません。

3

大文字を必要とする正規表現には何もありません。正規表現が課す要件は次のとおりです。

  • 少なくとも7文字です。
  • 大文字と小文字、数字の0-9、記号-().&@?"#,+'、空白、または/のみが含まれます。
  • 同じ行の3文字で開始しません。 (このチェックはおそらくパスワード全体に当てはまるこのチェックを意図していましたが、そうではありません)。

これは間違いではないと思われますが、パスワードの検証に使用されているようです。これは、いくつかの理由で正規表現の貧弱な使用です。

  1. 読みにくいです。正規表現は何を正確にチェックするのですか?文字の大混乱は実際に何をしていますか?あなたが正規表現の専門家ではない場合、それは不器用です。

  2. 1つの大きな正規表現に詰め込まれたいくつかの要件があります。チェックは、コードのいくつかの行に分割された場合、読みやすく、より保守し、次のようになります。

    if (password.length < 7)     reject("Too short."); 
    if (numRepeatedCharacters(password) >= 3) reject("Too repetitive."); 
    if (numDigits(password) < 1)    reject("Digit required."); 
    if (numSymbols(password) < 1)    reject("Symbol required."); 
    // etc. 
    
  3. はそれではなく、ブラックリストの文字ホワイトリストが含まれています。ホワイトリストの文字は使用しないでください。ユーザーがあなたが考えていない文字を使用するのを防ぐ理由はありません。アスタリスク、パーセント記号、アクセント付き文字などを使用する場合はどうすればよいですか?セキュリティ上の理由がないため、これらの文字を拒否します。

関連する問題