2009-10-13 10 views
107

与えられた文字列に以下の各カテゴリの文字が少なくとも1つ含まれていることを確認する正規表現とは?RegExは、文字列に少なくとも1つの小文字、大文字のchar、数字と記号が含まれていることを確認します

  • 小文字
  • 大文字
  • シンボル

私は(私は彼らが正しい得た個々のセットすなわち[a-z][A-Z]\d_|[^\w]ためのパターンを知って、」didnのt I?)。

しかし、これらの文字列を組み合わせて、どのような順序でこれらの文字列がすべて含まれていることを確認するにはどうすればよいですか?

+0

platform/regex-dialectは何ですか? Bartの答えは正しいですが、先読みアサーションはJavaScriptなどでは信頼できません。 – bobince

+0

特に - 私は正規表現を学んでいます。 javascriptで使用できる代替手段はありますか? – Amarghosh

+0

@bobinceこんにちは、私はなぜ先読みのアサーションがJavascriptで信頼できないのかを調べようとしています。これに書き直しはありますか? –

答えて

250

あなたが1つの正規表現が必要な場合は、試してみてください。

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$ 

短い説明:

^     // the start of the string 
(?=.*[a-z])  // use positive look ahead to see if at least one lower case letter exists 
(?=.*[A-Z])  // use positive look ahead to see if at least one upper case letter exists 
(?=.*\d)   // use positive look ahead to see if at least one digit exists 
(?=.*[_\W])  // use positive look ahead to see if at least one underscore or non-word character exists 
.+     // gobble up the entire string 
$     // the end of the string 

そして私はSilentGhostに同意し、[_\W]は、ビット幅の広いかもしれません。私はこれのような文字セットに置き換えます:[[email protected]#$%^&*.,?](もちろん、もっと自由に追加してください!)

+5

ありがとうBart。私は前向きな見方を知らなかった。 – Amarghosh

+0

最後の '。+'を '。*'に変更するとどうなりますか?私は '。* 'で失敗したテストケースを思いつくことができませんでした。この文脈では同じですか? 「ゼロ以上の文字」はうまくいくようです。ただ確認を求めるだけです。 – Amarghosh

+0

@Amarghosh:この場合、違いはありません。肯定的な先読みのため、文字列にはすでに少なくとも4文字が含まれています。ですから、 '。+'を '。*'や '。{4、}'に変更することに違いはありません。 –

4

これらの3つのグループを別々に照合し、それらがすべて存在することを確認することができます。また、​​は少し広すぎますが、それが\Wと置き換えたい場合は、

+0

ありがとう。私は\ Wを認識していませんでした。ちょうどそれを見て、それは単語ではないことに気づく。 \ Wと[\ W]に違いはありますか? [\ W]は冗長ですか? – Amarghosh

+0

@Amarghosh、はい、 '\ W'と' [\ W] 'は同じ結果になります。 –

2

バートキアー、あなたの正規表現にはいくつかの問題があります。冒頭、末尾または途中であれば、あなたがどんなにを検索している。このように

(.*[a-z].*)  // For lower cases 
(.*[A-Z].*)  // For upper cases 
(.*\d.*)   // For digits 

:それを行うための最善の方法はこれです。あなたの持っている私は複雑なパスワードに多くの問題があります。

関連する問題