パスワードの正規表現には、8文字以上、1つ以上の数字、小文字と大文字の両方および特殊文字を含める必要があります


445

正規表現で確認してください:

パスワードは少なくとも一つの番号を含む少なくとも8つの文字が含ま下と大文字や特殊文字の両方が含まれ、例えば#?!

それ古いパスワードであるか、またはユーザー名を含めることはできません、"password"または"websitename"

そして、ここに私の検証式は、大文字1文字、小文字1文字、数字または特殊文字1文字を含む8文字です。

(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"

パスワードはどのように書くことができますか?1つの大文字、1つの特殊文字、および英数字を含む8文字でなければなりません

回答:


1179

8文字以上、少なくとも1つの文字と1つの数字:

"^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$"

最小8文字、少なくとも1つの文字、1つの数字、および1つの特殊文字:

"^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$"

少なくとも8文字、少なくとも1つの大文字、1つの小文字、1つの数字:

"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$"

最小8文字、少なくとも1つの大文字、1つの小文字、1つの数字、および1つの特殊文字:

"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$"

最小8文字、最大10文字、少なくとも1つの大文字、1つの小文字、1つの数字、および1つの特殊文字:

"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,10}$"

46
"^(?=。* [A-Za-z])(?=。* \ d)[A-Za-z \ d] {8、} $"では、8文字の1つとして記号を使用できません
Wee

必須ではなく、すべての文字(特殊文字と句読点)に次の文字を使用できることがわかりました: "^(?=。* [az])(?=。* [AZ])(?=。* \ d)[a- zA-Z \ d \ w \ W] {8、} $ "
Gavin

413

この正規表現は、複数の先読みアサーション(条件)で使用できます。

^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$

この正規表現はこれらのルールを適用します:

  • 少なくとも1つの大文字の英語(?=.*?[A-Z])
  • 少なくとも1つの小文字の英字、 (?=.*?[a-z])
  • 少なくとも1桁 (?=.*?[0-9])
  • 少なくとも1つの特殊文字、 (?=.*?[#?!@$%^&*-])
  • 長さが最小8 .{8,}(アンカー付き)

71

正規表現にはAND演算子がないので、有効性が何かAND何かAND何かで定義されている場合、有効なパスワードに一致する正規表現を書くのはかなり困難です...

ただし、正規表現にはOR演算子があるため、DeMorganの定理を適用して、無効なパスワードに一致する正規表現を記述します。

8文字未満で何かORなしの数字を使って何ORなしの大文字で何かORなしの小文字とか何かOR特殊文字を使って何。

そう:

^(.{0,7}|[^0-9]*|[^A-Z]*|[^a-z]*|[a-zA-Z0-9]*)$

一致するものがあれば、それは無効なパスワードです。


3
さて、あなたは正規表現正規表現の違いに気付かないコンピューターサイエンティストの1人だったと思います。;)後で一致結果を否定できる場合、多くの正規表現タスクがはるかに単純であることは事実ですが、それが常に可能であるとは限りません。しかし、それは美しい正規表現です。シンプルではなくエレガントです!
Alan Moore、

1
なぜ私は以前に考えたことがないのですか?良い答え(結果を否定できる場合)
TeChn4K

2
これはスペースを許可していますが、正規表現でパスワードにスペースが含まれていないことを確認するにはどうすればよいですか?私はこれを試しました/^(\s|.{0,7}|[^0-9]*|[^AZ]*|[^az]*|[^$#@%]*|\s)$/ .test( 'aAa#a1a aa'); しかし、それは機能していません
Gaurav

1
@Gaurav、| [^ \ s] * \ s。*を追加
Matt Timmermans

1
大好きです。しかし、それが機能するためには、最後の条項を削除する|[a-zA-Z0-9]*必要がありました。
i-- 2016年

35

@anubhavaの答えのほんの少しの改善:特殊文字はキーボードの文字に限定されているため、これをすべての特殊文字に使用します。

^(?=.*?[A-Z])(?=(.*[a-z]){1,})(?=(.*[\d]){1,})(?=(.*[\W]){1,})(?!.*\s).{8,}$

この正規表現はこれらのルールを適用します:

  • 少なくとも1つの大文字の英字
  • 少なくとも1つの小文字の英字
  • 少なくとも1桁
  • 少なくとも1つの特殊文字
  • 長さが最小8

1
JavaScriptフレーバーでは、\WASCII文字のみに 一致します。したがって、これを変更していないため、空白文字を除外する必要があります。さらに、{1,}追加した括弧と数量詞はすべて純粋なノイズであり、貪欲でない(?)演算子を削除しても意味がありません。ここでは改善はありません。
Alan Moore、

そして空の文字列を避ける方法。空の文字列の正規表現はtrueを返します。次の正規表現を使用しました(?=。* [0-9])(?=。* [az])(?=。* [AZ])(?=。* [@#$%^&+ =]) (?= \\ S + $)。{8,15}
Coder

2
_特殊文字の失敗
Akhilesh

22

私の状況では、最も一般的な回答を理解するのが困難でした。たとえば、;やなどの文字で検証が失敗しました[。私は特殊文字のホワイトリストに興味がなかったので、代わりに[^\w\s]テストとして活用しました-簡単に言えば、単語以外の文字(数値を含む)と空白以外の文字を一致させます。要約すると、これが私のために働いたものです...

  • 少なくとも 8キャラクター
  • 少なくとも 1数字
  • 少なくとも1小文字
  • 少なくとも 1大文字
  • 少なくとも1特殊文字

/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[^\w\s]).{8,}$/

JSFiddle Link-さまざまなケースをカバーする簡単なデモ


2
良いですね。しかし、あなたの正規表現は受け入れないことがわかっ1つの問題を持っている_(アンダースコア)の特殊文字:(など。
user3217843

良いですが、少し間違いがあります。スペースを使用する場合、有効なパスワードではないスペースも受け入れます。
Dinesh.net 2016

下線を受け入れることができないことを除いて、私はこの答えが本当に好きです。私がしたすべては置き換えた(?=.*?[^\w\s])(?=.*?([^\w\s]|[_]))アンダースコアのサポートを追加するために、それは今で素晴らしい作品。また、@ Dinish.netを使用すると、取得したパスワード文字列から空白が削除されるため、バニラJS String.prototype.trim()メソッドを使用すると、この回答を使用する場合にうまく機能します。
Devin Carpenter

15

より一般的なバージョン(?)。英語の文字を特殊文字として使用できません。

^(?=\S*[a-z])(?=\S*[A-Z])(?=\S*\d)(?=\S*[^\w\s])\S{8,}$

var pwdList = [
    '@@V4-\3Z`zTzM{>k',
    '12qw!"QW12',
    '123qweASD!"#',
    '1qA!"#$%&',
    'Günther32',
    '123456789',
    'qweASD123',
    'qweqQWEQWEqw',
    '12qwAS!'
  ],
  re = /^(?=\S*[a-z])(?=\S*[A-Z])(?=\S*\d)(?=\S*[^\w\s])\S{8,}$/;
  
  pwdList.forEach(function (pw) {
    document.write('<span style="color:'+ (re.test(pw) ? 'green':'red') + '">' + pw + '</span><br/>');
  });


13

JavaScriptファイルをインポートしますjquery.validate.min.js

この方法を使用できます。

$.validator.addMethod("pwcheck", function (value) {
    return /[\@\#\$\%\^\&\*\(\)\_\+\!]/.test(value) && /[a-z]/.test(value) && /[0-9]/.test(value) && /[A-Z]/.test(value)
});
  1. 少なくとも1つの大文字の英字
  2. 少なくとも1つの小文字の英字
  3. 少なくとも1桁
  4. 少なくとも1つの特殊文字

10

これを試してください:

  1. 6文字以上
  2. 少なくとも1つの大文字
  3. 少なくとも1つの小文字
  4. 少なくとも1つの特殊文字

式:

"/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&.])[A-Za-z\d$@$!%*?&.]{6, 20}/"

オプションの特殊文字:

  1. 少なくとも1つの特殊文字
  2. 少なくとも1つの番号
  3. 特殊文字はオプションです
  4. 最小6文字、最大16文字

式:

"/^(?=.*\d)(?=.*[a-zA-Z]).{6,20}$/"

最小と最大の条件が不要な場合は削除します .{6, 16}

  • 6は最小文字数制限です
  • 20が最大文字数制限
  • ?=は一致表現を意味します

2
@Madhuオプションの特殊文字の条件に対する回答を更新しました
ojus kulkarni

7

質問に直接答えることはできませんが、本当に正規表現である必要がありますか?

私は多くのPerlを使用し、正規表現の問題の解決に慣れました。ただし、すべての先読みやその他の癖によりそれらがより複雑になると、これらの小さなバグをすべて殺すために、何十ものユニットテストを書く必要があります。

さらに、正規表現は通常、命令型または関数型のソリューションよりも数倍遅いです。

たとえば、次の(あまりFPではない)Scala関数は、最も一般的な回答の正規表現より約3倍速く元の質問を解決します。また、ユニットテストがまったく必要ないほど明確です。

def validatePassword(password: String): Boolean = {
  if (password.length < 8)
    return false

  var lower = false
  var upper = false
  var numbers = false
  var special = false

  password.foreach { c =>
    if (c.isDigit)       numbers = true
    else if (c.isLower)  lower = true
    else if (c.isUpper)  upper = true
    else                 special = true
  }

  lower && upper && numbers && special
}

7

ピーター・モーテンセンに返信しますが、評判がよくありません。

彼の表現は、指定された最小要件のそれぞれに最適です。特殊文字を必要としない彼の表現の問題は、特殊文字も許可されないため、OPが要求したとは思わない最大要件も強制することです。通常、ユーザーが自分のパスワードを必要なだけ強力にすることを許可します。なぜ強力なパスワードを制限するのですか?

したがって、彼の「最小8文字、少なくとも1つの文字と1つの数字」式:

^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$

最小要件を満たしていますが、残りの文字は文字と数字のみです。特殊文字を許可(必須ではない)するには、次のようなものを使用する必要があります。

^(?=.*[A-Za-z])(?=.*\d).{8,}$ 任意の文字を許可する

または

^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d$@$!%*#?&]{8,}$ 特定の特殊文字を許可する

同様に、「最低8文字、少なくとも1つの大文字、1つの小文字、1つの数字:」

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$

その最小要件を満たしていますが、使用できるのは文字と数字のみです。使用する:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$ 任意の文字を許可する

または

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d$@$!%*?&]{8,} 特定の特殊文字を許可します。


説明ありがとう。
HAIグエン

これは正解としてマークする必要があります。一番上の答えは間違っています。
ジェイク

6
Use the following Regex to satisfy the below conditions:

Conditions: 1] Min 1 uppercase letter.
            2] Min 1 lowercase letter.
            3] Min 1 special character.
            4] Min 1 number.
            5] Min 8 characters.
            6] Max 30 characters.

Regex: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#$@!%&*?])[A-Za-z\d#$@!%&*?]{8,30}$/    

2
あなたの答えは何年前に書かれた他の答えよりも優れていますか?
JSantos 2017

@ JoshYates1980正規表現が失敗した "特殊文字"について言及してください。それを確認して、それに応じて更新します。しかし、私が知る限り、1人の特殊文字の委任条件に従ってすべてで機能します。あなたの返事を待っています...
SHASHANK HONRAO

1
@SHASHANKHONRAO式を次のように更新しました:^(?=。* [az])(?=。* [AZ])(?=。* \ d)(?=。* [$ @ $!%*?&+ 〜|{}:;<>/])[A-Za-z\d$@$!%*?&+~| {}:; <> /] {8,15}には、次の非英数字が含まれます:(@ $!%*?&+〜 `| {}
:;

6

次の正規表現ソリューションを検討するのはどうですか?

^(?=.*[\w])(?=.*[\W])[\w\W]{8,}$

次のことを検証します。

  1. 少なくとも1つの小文字
  2. 少なくとも1つの大文字
  3. 少なくとも1桁
  4. 少なくとも1つの特殊文字
  5. 少なくとも8文字の長さが必要です。

次のリンクhttps://regex101.com/r/qPmC06/4/で動作することを確認してください


提案された正規表現とregex101リンクの下の正規表現は異なります。そうじゃないの^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W\_])[A-Za-z\d\W\_]{8,}$
CraZ

1
@CraZ私はあなたの提案をありがとう、正規表現を編集しました。
Emerson Joel Rojas Soliz

3

必要に応じて、このパターンはうまく機能します。これを試して、

^(?=(.*\d){1})(.*\S)(?=.*[a-zA-Z\S])[0-9a-zA-Z\S]{8,}

文字列変数を作成し、パターンを割り当て、パターンが正しい場合はtrue、そうでない場合はfalseを返すブールメソッドを作成します。

サンプル:

String pattern = "^(?=(.*\d){1})(.*\S)(?=.*[a-zA-Z\S])[0-9a-zA-Z\S]{8,}";
String password_string = "Type the password here"

private boolean isValidPassword(String password_string) {
    return password_string.matches(Constants.passwordPattern);
}

3

ここで多くの問題を見つけたので、私は自分で問題を作りました。

ここでそれはすべてテストで栄光です:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*([^a-zA-Z\d\s])).{9,}$

https://regex101.com/r/DCRR65/4/tests

注意点:

  1. 私がテストして\wいるが含まれているため、使用しません_
  2. 行の終わりにマッチせずに、シンボルのマッチに多くの問題を抱えてきました。
  3. 特に記号を指定していません。これは、ロケールによって、使用するキーボード上の記号が異なる場合があるためでもあります。

この正規表現は、パスワードに空白が含まれている場合でもパスし、私にとっては機能しませんでした
Arthur Melo


2

@ClasGはすでに提案しています:

^(?=\S*[a-z])(?=\S*[A-Z])(?=\S*\d)(?=\S*[^\w\s])\S{8,}$

ただし、_(アンダースコア)を特殊文字として使用することはできません(例:Aa12345_)。

改善されたものは:

^(?=\S*[a-z])(?=\S*[A-Z])(?=\S*\d)(?=\S*([^\w\s]|[_]))\S{8,}$

2

デモ:

function password_check() {
  pass = document.getElementById("password").value;
  console.log(pass);
  regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
  if (regex.exec(pass) == null) {
    alert('invalid password!')
  }
  else {
    console.log("valid");
  }
}
<input type="text" id="password" value="Sample@1">
<input type="button" id="submit" onclick="password_check()" value="submit">


2

2020年にこれをテストする:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$

自分を確認する

const regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
const str = `some12*Nuts`;
let m;

if ((m = regex.exec(str)) !== null) {
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}


これは受け入れられた答えよりもどのように優れていますか?
トト

@Totoこのスレッドには承認された回答はありません。少なくとも私には表示されません。投票数の多い回答がありますが、承認された回答は表示されません。さらに、これを見つけてregex101で有効性を確認したので、コードスニペットと共有して有効性を確認しました。
Mihir Kumar

1

次の正規表現を使用して、以下の条件を満たす必要があります。

Conditions: 1] Min 1 special character.
            2] Min 1 number.
            3] Min 8 characters or More

正規表現: ^(?=.*\d)(?=.*[#$@!%&*?])[A-Za-z\d#$@!%&*?]{8,}$

オンラインでテストできます:https : //regex101.com


1

HTML5を使用してこれを行うことができます。

以下のコードをパターン属性で使用し、

pattern="(?=^.{8,}$)((?=.*\d)(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"

それは完全に動作します。


1

以下の正規表現パターンを使用して、パスワードが期待と一致するかどうかを確認できます。

((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&*()]).{8,20})


1

これを使って、

((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%?=*&]).{8,20})

少なくとも1つの小文字、1つの大文字、1つの数字、および(!、@、#、$、%、?、=、*、&)の特殊文字を検証します。

最小長は8、最大長は20です。


これは受け入れられた回答とどう違うのですか?
Toto

0

Java / Androidで、次のパターンの少なくとも1つの数字、1つの文字、1つの特殊文字を使用してパスワードをテストするには:

"^(?=.*[A-Za-z])(?=.*\\d)(?=.*[$@$!%*#?&])[A-Za-z\\d$@$!%*#?&]{8,}$"

0

これを試して:

^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])[a-zA-Z0-9@#$%^&+=]*$

この正規表現は完全に機能します。

function myFunction() {
    var str = "c1TTTTaTTT@";
    var patt = new RegExp("^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])[a-zA-Z0-9@#$%^&+=]*$");
    var res = patt.test(str);
    console.log("Is regular matches:", res);
}

0

少なくとも1つの大文字、1桁の数字、および任意の特殊文字と、長さが8〜63のパターン。

「^(?=。[az])(?=。 [AZ])(?=。* \ d)[a-zA-Z \ d \ W] {8,63} $」

このパターンはJAVAプログラミングに使用されました。


0

以下が機能することを願っています。Azureカスタムポリシーでこれを試しました。

^(?=。[az])(?=。 [AZ])(?=。\ d)(?=。 [@#$%^&* -_ + = [] {} | \: ',? / ~&quot;();!])([A-Za-z\d@#$%^&amp;*\-_+=[\]{}|\\:',?/〜 "();!] |。(?!@)){6,16} $


0

私は実際に最初の答えをここにコピーして、より便利な正規表現に変えましたこれは、1つの大文字、1つの小文字、および少なくとも8文字を必要としますが、「中間」のすべてを受け入れます。

これはexample-regexであり、

  1. 8文字以上の長さ
  2. 少なくとも1つの小文字
  3. 少なくとも1つの大文字

重要:この正規表現は、他のすべての文字(数字、$、#などの特殊文字など)を除きます。など -ルール1.から3.が入力文字列に一致する限り

^(?=.*[a-z])(?=.*[A-Z]).{8,}$

"。"に注意してください 正規表現の最後のalomst。これは、ほとんどすべての(および読み取り可能な任意の)文字に一致します。


0

正規表現を使用して最小8文字をチェックする場合は、少なくとも1つの大文字、少なくとも1つの小文字、少なくとも1つの0〜9の数字、および少なくとも1つの特殊文字:!@#$%^ &* _?また、ユーザーがパスワードに欠けているものについての詳細情報をユーザーに提供する場合は、次のコードを使用できます。

let password = "@Aa3a4d$";

//  Check every single condition separately
let lowercase = password.match((/[a-z]+/g));
let uppercase = password.match((/[A-Z]+/g));
let digits = password.match((/[\d]+/g));
let special = password.match((/[!@#$%^&*_]+/g));
let lenght = password.match((/[A-Za-z\d!@#$%^&*_]{8,}/g));

//  Array to store information about any mismatches in the string
let errors = [];

if (password === '' ) {
    errors.push('Password is required');
}
if (lowercase === null) {
    errors.push('Password must include at least one lowercase letter');
}
if (uppercase === null) {
    errors.push('Password must include at least one uppercase letter');
}
if (digits === null) {
    errors.push('Password must include at least one digit from 0 to 9');
}
if (special  === null) {
    errors.push('Password must include at least one special character');
}
if (lenght === null) {
    errors.push('Password must include at least 8 characters');
}
if (errors.length > 0) {
    console.log(errors);
    return;
} else {
    // Process your password
}

-1

私は以前の答えの1つで見つけた解決策:

*最低8文字、大文字のアルファベット1つ、小文字のアルファベット1つ、数字1つ、特殊文字1つ:

"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}"*

...私にとってはうまくいきませんでしたが、以下は簡略化されたバージョンであり、うまくいきます(好きな特殊文字を追加します。ここに#を追加しました)。

"^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@$!%*?&]){8,}"

1
これは肯定的な先読みを定量化しています。
ctwheels
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.