Regex для пароля повинен містити щонайменше вісім символів, принаймні одне число, а також малі та великі літери та спеціальні символи


446

Я хочу, щоб регулярний вираз перевіряв:

Пароль містить щонайменше вісім символів, включаючи принаймні одне число і включає, як, малі та великі літери, так і спеціальні символи, наприклад # , ?, !.

Це не може бути ваш старий пароль або містити ваше ім'я користувача, "password" , або"websitename"

І ось мій вираз перевірки, який складається з восьми символів, включаючи одну велику літеру, одну малу літеру та одне число або спеціальний символ.

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

Як я можу записати його для пароля, має містити вісім символів, включаючи одну велику літеру, один спеціальний символ та буквено-цифрові символи ?

Відповіді:


1183

Мінімум вісім символів, принаймні одна літера та одне число:

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

Мінімум вісім символів, принаймні одна літера, одна цифра та один спеціальний символ:

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

Мінімум вісім символів, принаймні одна велика літера, одна маленька літера та одне число:

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

Мінімум вісім символів, принаймні одна велика літера, одна маленька літера, одне число та один спеціальний символ:

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

Мінімум вісім та максимум 10 символів, принаймні одна велика літера, одна маленька літера, одне число та один спеціальний символ:

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

46
"^ (? =. * [A-Za-z]) (? =. * \ D) [A-Za-z \ d] {8,} $" не дозволяє символів як один із 8 символів
Wee

Я знайшов наступні дозволені для всіх символів (спеціальні та пунктуаційні), не роблячи їх обов'язковими: "^ (? =. * [Az]) (? =. * [AZ]) (? =. * \ D) [a- zA-Z \ d \ w \ W] {8,} $ "
Гевін

413

Ви можете використовувати цей регулярний вираз із декількома твердженнями (умовами) пошуку :

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

Цей регулярний гекс буде застосовувати ці правила:

  • Принаймні одна велика літера англійською мовою ,(?=.*?[A-Z])
  • Принаймні одна англійська літера з нижнього регістру, (?=.*?[a-z])
  • Принаймні одна цифра, (?=.*?[0-9])
  • Принаймні один спеціальний персонаж, (?=.*?[#?!@$%^&*-])
  • Мінімальна довжина восьми .{8,}(з якорями)

71

У регулярних виразах немає оператора AND, тому досить складно написати регулярний вираз, який відповідає дійсним паролям, коли валідність визначається чимось І чимось І ЧИМИ іншим ...

Але звичайні вирази мають оператор АБО, тож просто застосуйте теорему DeMorgan і напишіть регулярний вираз, який відповідає невірним паролям:

Все, що має менше восьми символів АБО що завгодно, без цифр АБО нічого, що не має великої літери АБО, або нічого, що не містить АБО нічого, без спеціальних символів.

Тому:

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

Якщо щось відповідає цьому, то це недійсний пароль.


3
Добре, я боялася , що ти один з тих вчених - комп'ютерників ми іноді отримуємо , хто не розуміє , що є різниця між регулярними виразами і регулярними виразами . ;) Це правда, що багато завдань з регулярним вираженням набагато простіші, якщо згодом ви можете заперечувати результат матчу, але це не завжди можливо. Це гарний вираз, хоча. Це не просто, це елегантно!
Алан Мур

1
Чому я раніше не думав про це? Чудова відповідь (коли можна заперечувати результат)
TeChn4K

2
це дозволяє пробілам, як перевірити, чи не повинен пароль містити пробіл у вашому regexp? я спробував це /^(\s|.{0,7}| evidence^0-9 снимки*| evidence^AZ обвиняемый||^^ azgery*| freed^$#@%Sense*|\s)$/ .test ('aAa # a1a aa'); але це не працює
Гаурав

1
@Gaurav, додати | [^ \ s] * \ s. *
Метт Тіммерманс

1
Любіть це. Щоб воно працювало, мені довелося зняти з нього останній пункт |[a-zA-Z0-9]*.
я--

35

Лише невелике вдосконалення для відповіді @ anubhava: Оскільки спеціальні символи обмежені тими, що знаходяться на клавіатурі, використовуйте це для будь-якого спеціального символу:

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

Цей регулярний гекс буде застосовувати ці правила:

  • Принаймні одна велика літера англійською мовою
  • Принаймні одне письмо англійською літерами
  • Принаймні одна цифра
  • Принаймні один спеціальний персонаж
  • Мінімум вісім завдовжки

1
За смаком JavaScript \Wвідповідає лише символам ASCII. Отже ви цього не змінили, і тепер вам доведеться відфільтрувати символи пробілу. Крім того, всі {1,}додані вами круглі дужки та кількісні показники - це чистий шум, і видаляти не жадібні ( ?) оператори було безглуздо. Поліпшення тут немає.
Алан Мур

І як уникнути порожнього рядка. Порожній виразок рядка повинен повернути true. Я використовував наступний регулярний вираз (? =. * [0-9]) (? =. * [Az]) (? =. * [AZ]) (? =. * [@ # $% ^ & + =]) (? = \\ S + $). {8,15}
Кодер

2
не виконується для _ спеціальний символ
Akhilesh

22

У мене були певні труднощі, як слідкувати за найпопулярнішою відповіддю для моїх обставин. Наприклад, моя перевірка не вдалася до таких символів, як ;або [. Мене не зацікавило біле перелічення моїх спеціальних символів, тому я замість цього використовував [^\w\s]як тест - просто кажучи - збіг не символів, що не містять слів (включаючи числові), а не символи пробілу. Підводячи підсумок, ось що для мене спрацювало ...

  • принаймні 8символів
  • принаймні 1числовий символ
  • принаймні 1малі літери
  • принаймні 1великі літери
  • принаймні 1особливого характеру

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

JSFiddle Link - проста демонстрація, що охоплює різні випадки


2
Хороший. але знайшли одне питання, згідно з яким ваш регулярний вираз не сприймає _ (підкреслення) як спеціальний символ :(.
user3217843

Добре, але мало помилок. Він також приймає пробіл, який не є дійсним паролем, якщо ми використовуємо пробіл.
Dinesh.net

Мені дуже подобається ця відповідь, за винятком того, що вона не може прийняти підкреслення. Все , що я зробив , було замінити (?=.*?[^\w\s])з , (?=.*?([^\w\s]|[_]))щоб додати підтримку для підкреслення і тепер він прекрасно працює. Також у системі @ Dinish.net я використовую обрізання пробілу з рядка пароля, коли ми його отримаємо, тому використання методу vanilla JS String.prototype.trim () буде добре працювати, якщо ви хочете використовувати цю відповідь.
Девін Карпентер

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. Принаймні одна велика літера англійською мовою
  2. Принаймні одне письмо англійською літерами
  3. Принаймні одна цифра
  4. Принаймні один спеціальний персонаж

10

Спробуйте це:

  1. Мінімум шість символів
  2. Принаймні один верхній регістр
  3. Принаймні один малий символ
  4. Принаймні один спеціальний персонаж

Вираз:

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

Необов’язкові спеціальні символи:

  1. Принаймні один спеціальний персонаж
  2. Принаймні одне число
  3. Спеціальні символи необов’язкові
  4. Мінімум шість символів і максимум 16 символів

Вираз:

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

Якщо умова min та max не потрібна, тоді видаліть .{6, 16}

  • 6 - мінімальна межа символів
  • 20 - максимальна межа символів
  • ? = означає вираження відповідності

2
@Madhu Я оновив свою відповідь щодо вашого стану необов'язкових спеціальних символів
ojus kulkarni

7

Не відповідаючи безпосередньо на питання, але чи справді це має бути регулярний вираз?

Раніше я робив багато Perl, і звик вирішувати проблеми з регулярними виразами. Однак, коли вони ускладнюються з усіма оглядами та іншими примхами, вам потрібно написати десятки одиничних тестів, щоб убити всіх цих маленьких помилок.

Крім того, регулярне вираження, як правило, в кілька разів повільніше, ніж імперативне або функціональне рішення.

Наприклад, наступна (не дуже FP) функція Scala вирішує початкове запитання приблизно втричі швидше, ніж регулярний вираз найпопулярнішої відповіді. Те, що він робить, також настільки зрозуміло, що вам взагалі не потрібен тест:

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

Я б відповів на Пітера Мортенсена, але мені не вистачає репутації.

Його вирази ідеально підходять для кожної із зазначених мінімальних вимог. Проблема з його виразами, які не потребують спеціальних символів, полягає в тому, що вони також НЕ ДОБАВЛЯють спеціальних символів, тому вони також застосовують максимальні вимоги, які я не вважаю, що ОП вимагали. Зазвичай ви хочете дозволити своїм користувачам зробити свій пароль настільки сильним, наскільки вони хочуть; навіщо обмежувати надійні паролі?

Отже, вираз "мінімум вісім символів, принаймні одна літера та одне число":

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

досягає мінімальної вимоги, але решта символів можуть бути лише літерою та цифрами. Щоб дозволити (але не вимагати) спеціальних символів, слід використовувати щось на кшталт:

^(?=.*[A-Za-z])(?=.*\d).{8,}$ щоб дозволити будь-які символи

або

^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d$@$!%*#?&]{8,}$ щоб дозволити конкретні спеціальні символи

Так само "мінімум вісім символів, принаймні одна велика літера, одна мала літера та одне число:"

^(?=.*[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,} щоб дозволити конкретні спеціальні символи.


Дякую за пояснення.
Hải Nguyễn

Це слід позначити як правильну відповідь. Верхня відповідь неправильна.
Джейк

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

@ JoshYates1980, будь ласка, будь ласка, згадайте "Спеціальний персонаж", для якого регулярний вираз не вдався до вас. Дозвольте мені перевірити це і оновити його відповідно. Але наскільки я знаю, це працює з усіма відповідно до умови мандату 1 спеціального персонажа. Чекаю на вас відповіді ....
SHASHANK HONRAO

1
@SHASHANKHONRAO Я оновив вираз до: ^ (? =. * [Az]) (? =. * [AZ]) (? =. * \ D) (? =. * [$ @ $!% *? & + ~ |{}:;<>/])[A-Za-z\d$@$!%*?&+~| {}:; <> /] {8,15}, які включатимуть у себе такі цифри, що не містять цифри: (@ $!% *? & + ~ `| {}
:;

6

Як щодо розгляду наступного рішення регулярного виразів:

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

Який підтверджує наступне:

  1. Принаймні одна маленька літера
  2. Принаймні одна велика літера
  3. Принаймні одна цифра
  4. Принаймні один спеціальний персонаж
  5. Принаймні, він повинен мати 8 символів.

Перевірте це, працюючи за наступним посиланням https://regex101.com/r/qPmC06/4/


Ваш запропонований регулярний вираз і той, який знаходиться під посиланням regex101, варіюється. Чи не повинно бути ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W\_])[A-Za-z\d\W\_]{8,}$?
CraZ

1
@CraZ Я відредагував регулярний вираз, дякую за вашу пропозицію.
Емерсон Джоел Рохас Соліз

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. Не вказує конкретно символи, це також тому, що різні локалі можуть мати різні символи на своїх клавіатурах, які вони можуть використовувати.

Цей провідник проходить навіть тоді, коли білі пробіли знаходяться всередині пароля, для мене не працював
Артур Мело


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}`);
    });
}


Як це краще, ніж прийнята відповідь?
Тото

@Тож у цій темі немає прийнятої відповіді, принаймні я не бачу жодної, є відповіді з багатьма голосами, але я не бачу прийнятої відповіді. Плюс я знайшов цей і прочитав про нього на regex101 на предмет дійсності, тому поділився ним з фрагментом коду, щоб перевірити також дійсність.
Міхір Кумар

1

Використовуйте такий Regex, щоб задовольнити наведені нижче умови:

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

Regex: ^(?=.*\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})

Він буде підтверджений принаймні для одного малого, одного верхнього регістру, одного числа та спеціальних символів (!, @, #, $,%,?, =, *, &).

Мінімальна довжина - 8, а максимальна - 20


Чим це відрізняється від прийнятої відповіді?
Toto

0

В Java / Android, щоб перевірити пароль принаймні одним номером, однією літерою, одним спеціальним символом у наступному шаблоні:

"^(?=.*[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

Насправді я просто скопіював тут першу відповідь і перетворив її на більш зручний для sx регулярний вираз яка потребує однієї верхньої, однієї нижньої та принаймні 8 символів, але приймає все "між ними".

Цей приклад - регулярний вираз, який вимагає

  1. не менше 8 символів
  2. хоча б одну малу літеру
  3. принаймні одна велика літера

ВАЖЛИВО : Цей регулярний гекс буде також, крім всіх інших символів, наприклад цифр, спеціальних символів, таких як $, #,! і т. д. - доки правила 1. до 3. відповідають рядку введення

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

Пам'ятайте "." alomst в кінці виразки. Це буде відповідати майже будь-якому (і афаіку будь-якому читаемому) персонажу


0

Якщо ви хочете використовувати регулярні вирази, щоб перевірити наявність мінімум восьми символів, хоча б одну велику літеру, принаймні одну малу літеру, принаймні одне число від 0 до 9 і хоча б один спеціальний символ від:! @ # $% ^ & * _? І також дайте користувачеві трохи більше інформації про те, чого вони відсутні у паролі, ви можете використовувати наступний код:

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

Я знайшов рішення в одній з попередніх відповідей як:

* Мінімум 8 символів, щонайменше, 1 великий алфавіт, 1 рядковий алфавіт, 1 номер та 1 спеціальний символ:

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

... не працювало для мене, але наступна спрощена версія і чудово працює (додайте будь-який спеціальний символ, який вам подобається, я додав тут #), а також додайте правило числення, як це робиться з літерами як:

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

1
Це кількісне визначення позитивного рівня пошуку.
ctwheels
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.