密码的正则表达式必须包含至少八个字符、至少一个数字以及小写和大写字母以及特殊字符

Regex for password must contain at least eight characters, at least one number and both lower and uppercase letters and special characters

提问人:Swapnil Tatkondawar 提问时间:10/26/2013 最后编辑:Sebastian SimonSwapnil Tatkondawar 更新时间:7/27/2023 访问量:1344035

问:

我想要一个正则表达式来检查:

密码至少包含八个字符,包括至少一个数字,并包含小写和大写字母以及特殊字符,例如 、 、 。#?!

它不能是您的旧密码,也不能包含您的用户名、或"password""websitename"

这是我的验证表达式,它适用于八个字符,包括一个大写字母、一个小写字母和一个数字或特殊字符。

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

密码必须是八个字符,包括一个大写字母、一个特殊字符和字母数字字符,我怎么能写它?

JavaScript asp.net 正则表达式

评论

0赞 ctwheels 1/14/2021
请参阅参考 - 密码验证

答:

791赞 anubhava 10/26/2013 #1

您可以将此正则表达式与多个前瞻断言(条件)一起使用:

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

此正则表达式将强制执行以下规则:

  • 至少一个大写英文字母(?=.*?[A-Z])
  • 至少一个小写英文字母,(?=.*?[a-z])
  • 至少一位数字,(?=.*?[0-9])
  • 至少一个特殊字符,(?=.*?[#?!@$%^&*-])
  • 最短长度为八(带锚).{8,}

评论

1赞 dat1dev 8/20/2023
由于与号字符代码,可能值得从允许的特殊字符中删除“&”。有一些 ASCII 字符在 JavaScript 字符串中表现不正常,这就是其中之一。
54赞 Edwin Beltran 1/11/2014 #2

只是对 @anubhava 的回答进行了一个小的改进:由于特殊字符仅限于键盘中的字符,因此请将其用于任何特殊字符:

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

此正则表达式将强制执行以下规则:

  • 至少一个大写英文字母
  • 至少一个小写英文字母
  • 至少一位数字
  • 至少一个特殊字符
  • 最少长度为 8 个

评论

2赞 Alan Moore 11/8/2015
在 JavaScript 风格中,仅匹配 ASCII 字符。所以你没有改变它,现在你必须过滤掉空格字符。此外,您添加的所有括号和量词都是纯噪声,删除非贪婪 () 运算符毫无意义。这里没有改进。\W{1,}?
2260赞 Srinivas 1/30/2014 #3

至少 8 个字符,至少一个字母和一个数字:

"^(?=.*[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 个字符,至少一个大写字母、一个小写字母、一个数字和一个特殊字符:

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

评论

98赞 Wee 1/6/2015
“^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$” 不允许将符号作为 8 个字符之一
37赞 Gavin 6/7/2020
我发现所有字符(特殊和标点符号)都允许以下内容,而没有强制使用:“^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d\w\W]{8,}$”
1赞 kataba 8/24/2022
请注意,上面的正则表达式不包括 、 和 等符号。另一种选择是:它涵盖了所有其他字符。^()^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,}$
7赞 crrmacarse 11/3/2022
检查符号的替代方法应该是尝试具有不是单词、数字和空格的负匹配项。当前只捕获特定符号,其中常见符号(如 dot(.) 或 plus(+) 将失败(?=.*[^\w\d\s])[A-Za-z\d@$!%*?&]
1赞 Tharaka 4/13/2023
我在此解决方案中发现的一个主要问题是,如果密码包含未在正则表达式中指定的特殊字符(例如逗号),则它将失败。
15赞 Vikram 4/24/2014 #4

导入 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. 至少一个特殊字符
50赞 scniro 10/23/2015 #5

我很难按照我的情况找到最受欢迎的答案。例如,我的验证失败,并带有 或 等字符。我对将我的特殊字符列入白名单不感兴趣,所以我转而利用作为测试 - 简单地说 - 匹配非单词字符(包括数字)和非空格字符。总而言之,这是对我有用的东西......;[[^\w\s]

  • 至少字符数8
  • 至少为数字字符1
  • 至少小写字母1
  • 至少大写字母1
  • 至少特殊字符1

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

JSFiddle Link - 涵盖各种案例的简单演示

评论

2赞 user3217843 5/20/2016
好东西。但是发现了一个问题,您的正则表达式不会接受_(下划线)作为特殊字符:(。
8赞 Devin Carpenter 8/27/2019
我真的很喜欢这个答案,除了它不能接受下划线。我所做的只是替换为添加对下划线的支持,现在效果很好。另外@Dinish.net 我使用的系统在得到密码字符串时会修剪掉密码字符串中的空格,所以如果你想使用这个答案,使用香草 JS String.prototype.trim() 方法会很好用。(?=.*?[^\w\s])(?=.*?([^\w\s]|[_]))
2赞 shiyani suresh 11/4/2015 #6
(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+-]).{6}

评论

1赞 shiyani suresh 11/4/2015
欲了解更多详情,请查看 knowledge-hubs.blogspot.in/2015/11/...
140赞 Matt Timmermans 11/8/2015 #7

正则表达式没有 AND 运算符,因此当有效性由 AND else 和 something else 定义时,很难编写与有效密码匹配的正则表达式......

但是,正则表达式确实有一个 OR 运算符,因此只需应用 DeMorgan 定理,并编写一个与无效密码匹配的正则表达式:

少于 8 个字符的任何内容,没有数字的任何内容没有大写字母 OR 的任何内容,没有小写字母的任何内容或者没有特殊字符的任何内容。

所以:

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

如果有任何匹配项,则该密码无效。

评论

8赞 G M 7/6/2022
这是更好的答案之一。其他答案不包括特殊字符,如“(”或“)”。很棒的解决方案!
0赞 Felix 7/27/2022
这很好,谢谢!我注意到一些浏览器(如Firefox)会创建没有特殊字符的“安全密码”,因此我删除了最后一个选项|[a-zA-Z0-9]* ..我对此感到满意。
3赞 djoll 11/6/2022
此外,某些浏览器正则表达式引擎不允许前瞻断言,因此如果需要客户端验证,这是一个理想的解决方案。
0赞 Barreto 5/22/2023
这看起来真的很好,我一直在寻找这个答案,但这性能好吗?
0赞 Matt Timmermans 5/22/2023
是的,它的性能应该比基于前瞻的选项好得多。
2赞 Arun Sivanandan 6/30/2016 #8

根据您的需要,此模式应该可以正常工作。试试这个,

^(?=(.*\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);
}
0赞 Dadaji 8/5/2016 #9

在 Java/Android 中,要测试至少一个数字、一个字母、一个特殊字符的密码,请采用以下模式:

"^(?=.*[A-Za-z])(?=.*\\d)(?=.*[$@$!%*#?&])[A-Za-z\\d$@$!%*#?&]{8,}$"
12赞 ojus kulkarni 10/19/2016 #10

试试这个:

  1. 最少 6 个字符
  2. 至少一个大写字符
  3. 至少一个小写字符
  4. 至少一个特殊字符

表达:

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

可选特殊字符:

  1. 至少一个特殊字符
  2. 至少一个数字
  3. 特殊字符是可选的
  4. 最少 6 个字符,最多 16 个字符

表达:

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

如果不需要最小值和最大值条件,则删除.{6, 16}

  • 6 是最小字符限制
  • 20 是最大字符限制
  • ?= 表示匹配表达式
0赞 Kiwi Rupela 3/23/2017 #11

试试这个:

^.*(?=.{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);
}
-1赞 Carette 4/5/2017 #12

我在之前的答案之一中找到的解决方案是:

*最少 8 个字符,至少 1 个大写字母、1 个小写字母、1 个数字和 1 个特殊字符:

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

...对我不起作用,但以下是简化版本并且效果很好(添加您喜欢的任何特殊字符,我在这里添加了#),并添加数字规则,就像您对字母所做的那样:

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

评论

1赞 ctwheels 1/30/2018
这量化了对未来的积极展望。
59赞 SHASHANK HONRAO 7/13/2017 #13

使用以下正则表达式来满足以下条件:

条件:

  1. 最少 1 个大写字母。
  2. 最少 1 个小写字母。
  3. 最少 1 个特殊字符。
  4. 最少 1 个数字。
  5. 最少 8 个字符。
  6. 最多 30 个字符。

正则表达式:

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

评论

4赞 JSantos 7/13/2017
你的答案在哪些方面比几年前写的其他答案更好?
3赞 JoshYates1980 10/23/2017
@SHASHANKHONRAO我将表达式更新为:^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&+~|{}:;<>/]{8,15},其中将包含以下非字母数字字符:(@$!%*?&+~'|{}:;<>/)|{}:;<>/])[A-Za-z\d$@$!%*?&+~
12赞 Heikki Salokanto 8/21/2017 #14

没有直接回答这个问题,但它真的必须是一个正则表达式吗?

我曾经做过很多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
}

评论

0赞 Marco 12/12/2022
你的解决方案比正则表达式好得多。我知道你的答案很老,但谢谢你提供了一个很棒的创造性解决方案。
24赞 SamWhan 9/26/2017 #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/>');
  });

3赞 SONewbiee 12/29/2017 #16

@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,}$
1赞 Anup Seth 3/19/2018 #17

匹配至少 1 个大写字符、1 个数字和任何特殊字符以及长度介于 8 到 63 之间的模式。

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

此模式用于 JAVA 编程。

评论

0赞 e-info128 8/16/2021
Aaaaaaa1有效,但不需要特殊字符。在组的末尾添加。(?=.*\W)
1赞 Samrat Saha 4/26/2018 #18

使用以下正则表达式来满足以下条件:

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赞 Vidya 5/16/2018 #19

只是我们可以通过使用 HTML5 来做到这一点。

在模式属性中使用以下代码,

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

它将完美地工作。

1赞 Harshal_Kalavadiya 7/30/2018 #20

您可以使用下面的正则表达式模式来检查密码是否符合您的期望。

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

希望以下内容有效。我在 Azure 自定义策略中尝试过这个。

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@#$%^&amp;*\-_+=[\]{}|\\:',?/`~&quot;();!])([A-Za-z\d@#$%^&amp;*\-_+=[\]{}|\\:',?/`~&quot;();!]|\.(?!@)){6,16}$
1赞 Tai Ho 11/22/2018 #22
(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$

在线链接检查 https://regex101.com/r/mqGurh/1

3赞 Stefano 12/20/2018 #23

我在这里发现了很多问题,所以我自己做了。

在这里,它尽显荣耀,并进行了测试:

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

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

需要注意的事项:

  1. 不使用,因为这包括我正在测试的 。\w_
  2. 我在匹配符号时遇到了很多麻烦,而没有匹配行尾。
  3. 没有专门指定符号,这也是因为不同的区域设置在其键盘上可能具有不同的符号,他们可能想要使用这些符号。
1赞 Frithjof Schaefer 8/22/2019 #24

实际上,我只是在这里复制了第一个答案,并将其变成了一个更方便用户体验的正则表达式,它需要一个上、一个下和至少 8 个字符,但接受“介于两者之间”的所有内容。

这是一个示例正则表达式,它需要

  1. 长度至少为 8 个字符
  2. 至少一个小写字母
  3. 至少一个大写字母

重要提示:此正则表达式还将排除所有其他字符,例如数字、特殊字符(如 $、#、! 等) - 只要规则 1.至 3.匹配输入字符串

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

注意“.”几乎在正则表达式的末尾。这将匹配几乎任何(以及任何可读的)字符

3赞 Mohideen bin Mohammed 11/14/2019 #25

演示:

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">

1赞 Anand Raja 11/30/2019 #26

用这个,

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

它将验证至少一个小写字母、一个大写字母、一个数字和 (!,@,#,$,%,?,=,*,&) 的特殊字符。

最小长度为 8,最大长度为 20

11赞 Emerson Joel Rojas Soliz 12/4/2019 #27

考虑以下正则表达式解决方案怎么样:

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

这验证了以下内容:

  1. 至少一个小写字母
  2. 至少一个大写字母
  3. 至少一位数字
  4. 至少一个特殊字符
  5. 至少它应该有 8 个字符长。

在以下链接中查看它 https://regex101.com/r/qPmC06/4/

评论

0赞 CraZ 12/18/2019
您建议的正则表达式和 regex101 链接下的正则表达式有所不同。不应该吗?^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W\_])[A-Za-z\d\W\_]{8,}$
4赞 MiKr13 6/4/2020 #28

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

12赞 Dana 6/28/2020 #29

这对我有用:

^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@$!%*?&])([a-zA-Z0-9@$!%*?&]{8,})$
  • 长度至少为 8 个字符;
  • 一个小写字母、一个大写字母、一个数字和一个特殊字符;
  • 没有空格。

评论

0赞 Mohd Qasim 3/15/2022
是的,它用空格变得错误
10赞 Milan Paudyal 10/7/2020 #30
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+,.\\\/;':"-]).{8,}$
    
5赞 Hasan Tezcan 12/17/2020 #31
/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).*$/

这是使用它的简单方法,同时验证至少 1 个大写字母、1 个小写字母和 1 个数字

这是我在快速验证中使用的示例

check('password')
    .notEmpty()
    .withMessage('Password cannot be null')
    .bail()
    .isLength({ min: 6 })
    .withMessage('Password must be at least 6 characters')
    .bail()
    .matches(/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).*$/)
    .withMessage(
      'Must have atleast 1 uppercase, 1 lowercase letter and 1 number'
    ),
3赞 Masoud 1/4/2021 #32
var strongRegex = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})");
var mediumRegex = new RegExp("^(((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{6,})");

最适合 javascript

评论

0赞 Basel Akasha 4/16/2021
这些正则表达式的条件是什么?
0赞 Ekanem Eno 4/18/2021
我认为您的变量正在检查至少 6 个字符,而不是 8 个字符mediumRegex
-2赞 Wprog_dy 2/5/2021 #33
     var value=$("#password").val();
     $.validator.addMethod("strongePassword",function(value) 
     {
         return /^[A-Za-z0-9!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]*$/.test(value) && /[a-z]/.test(value) && /\d/.test(value) && /[A-Z]/.test(value)&& /[A-Z]/.test(value);`enter code here`
     },'Password must have minimum 9 characters and contain at least 1 UPPERCASE, 1 lower case, 1 number, 1 special character.');
14赞 Sazzad 8/1/2021 #34

对于标准密码要求,我发现这很有用:

  • 至少 1 个字母

  • 至少 1 位数字

  • 不包含空格

  • 可选特殊字符,例如 @$!%*#?&^_-

  • 最短长度为 8 个字符

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

您还可以设置上限,例如 {8,32},长度不超过 32 个字符。

2赞 nakorndev 9/19/2021 #35

如果您不喜欢使用正则表达式。所以这个模块有很大帮助:https://www.npmjs.com/package/password-validator

var passwordValidator = require('password-validator');
 
// Create a schema
var schema = new passwordValidator();
 
// Add properties to it
schema
.is().min(8)                                    // Minimum length 8
.is().max(100)                                  // Maximum length 100
.has().uppercase()                              // Must have uppercase letters
.has().lowercase()                              // Must have lowercase letters
.has().digits(2)                                // Must have at least 2 digits
.has().not().spaces()                           // Should not have spaces
.is().not().oneOf(['Passw0rd', 'Password123']); // Blacklist these values
 
// Validate against a password string
console.log(schema.validate('validPASS123'));
// => true
console.log(schema.validate('invalidPASS'));
// => false
11赞 Steve Johnson 11/2/2021 #36

对于需要满足以下条件的更严格的验证:

  1. 至少一个大写字符
  2. 至少一个小写字符
  3. 至少一位数字
  4. 至少一个符号/特殊字符 @$!%*#?&^_-
  5. 最少 8 个字符/数字

正则表达式:

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

我希望它能帮助那些更严格的人。

5赞 Mosia Thabo 11/26/2021 #37

保持简单愚蠢:

这应该总是对你有用。

正则表达式:^(.{0,7}|[^a-z]{1,}|[^A-Z]{1,}|[^\d]{1,}|[^\W]{1,})$|[\s]

如果您的密码与上述正则表达式匹配,则该密码无效。

如果没有匹配项,则您的密码有效,并且包含至少 8 个字符、一个大写字母、一个小写字母和一个符号或特殊字符。而且它也不包含空格、制表符或换行符。

正则表达式的细分

  1. .{0,7}- 如果密码包含 0 到 7 个字符,则匹配。
  2. [^a-z]{1,}- 如果未找到小写字母,则匹配
  3. [^A-Z]{1,}- 如果未找到大写字母,则匹配
  4. [^\d]{1,}- 如果未找到数字(介于 [0-9]) 之间,则匹配
  5. [\s]- 如果找到空格、制表符或换行符,则匹配。

使用这种方法,在允许的符号方面没有限制或限制。如果要限制为允许的符号很少,只需将 更改为 .[^\W][^YourSymbols]

8赞 The fourth bird 12/14/2021 #38

另一种选择是使用否定字符类在前瞻断言中使用对比度,可以选择匹配任何字符,但在匹配应匹配的字符之前列出的字符除外。

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

观看正则表达式演示

在某种程度上,模式匹配:

  • ^字符串的开头
  • (?=[^A-Z\n]*[A-Z])积极展望,断言 0+ 倍除 A-Z 或换行符以外的任何字符。然后匹配字符 A-Z
  • (?=[^a-z\n]*[a-z])char a-z 的相同方法
  • (?=[^0-9\n]*[0-9])数字 0-9 采用相同的方法
  • (?=[^#?!@$%^&*\n-]*[#?!@$%^&*-])对于您认为特殊的字符,采用相同的方法
  • .{8,}匹配除换行符以外的任何字符 8 次或更多次
  • $字符串末尾

笔记

  • 点也可以与空格匹配。如果不想允许匹配空格,则可以更改为匹配 8 个或更多非空格字符.{8,}\S{8,}
  • 使用 either 或 可以匹配比 lookahead 断言中指定的字符更多的字符。如果只想匹配断言中使用的字符,则可以使用字符类更改为仅匹配允许的字符.\S.{8,}[#?!@$%^&*A-Za-z0-9-]{8,}

const regex = /^(?=[^A-Z\n]*[A-Z])(?=[^a-z\n]*[a-z])(?=[^0-9\n]*[0-9])(?=[^#?!@$%^&*\n-]*[#?!@$%^&*-]).{8,}$/;
[
  "abcA1#!A",
  "#!asdfSFD1;",
  "# a f F1 ;",
  "1111111111",
  "aaaaaaaa",
  "11111111",
  "AAAAAAAA",
  "########",
  "aA1#"
].forEach(s =>
  console.log(regex.test(s) ? `Match --> ${s}` : `No match --> ${s}`)
);

评论

1赞 bobble bubble 9/27/2022
效率明显,不错!对于那些喜欢任何特殊且没有空格的人来说,可以用于特殊部分,并替换末尾的点部分(演示(?=[^\W_]*[\W_])\S{8,})
2赞 Jordi Gomis 6/8/2022 #39

使用此正则表达式,满足所有条件:

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

此正则表达式将强制执行以下规则:

  • 至少一个大写字母,(?=.*?[A-Z])
  • 至少一个小写字母,(?=.*?[a-z])
  • 至少一位数字,(?=.*?[0-9])
  • 至少一个特殊字符,即前 3 个条件中未包含的任何字符,(?=.*?[^A-Za-z0-9])
  • 最少长度为 8 个.{8,}
0赞 Rahul Sheth 6/17/2022 #40
"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[\\\\`~!@#$%^&/*()_+=[{}]\\[\\]|\\:;'\"<>.,?/-]).{8,}$";
55赞 Rasaf Ibrahim 6/20/2022 #41

 

✅ 以下 4 种正则表达式模式可以帮助您编写几乎任何密码验证

 

 

模式 1:

 

密码必须包含1-9个数字,一个小写字母,一个大写字母,一个特殊字符,不能有空格,长度必须为8-16个字符。

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

 

解释:

 

  • (?=.*[0-9])表示密码必须包含 1 到 9 之间的一位数字。

 

  • (?=.*[a-z])表示密码必须包含一个小写字母。

 

  • (?=.*[A-Z])表示密码必须包含一个大写字母。

 

  • (?=.*\W)表示密码必须包含一个特殊字符。

 

  • .{8,16}表示密码长度必须为 8-16 个字符。我们必须在正则表达式的末尾,就在符号之前使用它。$

 

什么是 ^$

 

^指示字符串的开头。 指示字符串的末尾。$

如果我们不使用这些 & ,正则表达式将无法确定密码的最大长度。在上面的示例中,我们有一个条件,即密码不能超过 16 个字符,为了使该条件起作用,我们使用了这些^$^ & $

 

删除最大长度限制:

 

  • 而不是 ,如果我们使用 ,则意味着密码必须至少为 8 个字符长。因此,检查密码的最大长度没有任何条件。.{8,16}.{8,}

 

不接受任何数字(数字):

 

  • 而不是 ,如果我们使用 ,则意味着密码不得包含 1-9 之间的任何数字(与 的区别在于使用 而不是(?=.*[0-9])(?!.*[0-9])(?=.*[0-9])!=)

 

不接受任何特殊字符:

 

  • 而不是 ,如果我们使用 ,则意味着密码不得包含任何特殊字符(与 的区别在于使用 而不是(?=.*\W)(?!.*\W)(?=.*\W)!=)

 

number(digit) 的替代语法:

 

  • 代替 ,我们可以使用 . 还意味着密码必须包含 1 到 9 之间的一位数字。(?=.*[0-9])(?=.*\d)(?=.*\d)

 

 

模式 2:

 

密码必须包含 1 到 9 之间的一位数字、一个小写字母、一个大写字母、一个下划线但不能包含其他特殊字符、空格,长度必须为 8-16 个字符。

/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*_)(?!.*\W)(?!.* ).{8,16}$/

 

与模式 1 的区别

 

  • 在这里,我们使用了 .(?=.*_)Pattern 1

 

  • (?=.*_)(?!.*\W)表示密码必须包含下划线,但不能包含任何其他特殊字符。

 

模式 3:

 

密码必须包含 1 到 9 之间的一位数字、一个小写字母、一个大写字母、一个下划线、无空格,长度必须为 8-16 个字符。除下划线外的任何其他特殊字符的使用是可选的。

/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*_)(?!.* ).{8,16}$/

 

与模式 2 的区别

 

  • 在这里,我们没有使用 .(?!.*\W)Pattern 2

 

  • 但它仍然具有(?=.*_)

 

  • 通过删除 ,特殊字符已成为可选字符。现在,一个下划线是必需的,但可以使用或不使用任何其他特殊字符,因为它是可选的。(?!.*\W)

 

模式 4:

 

密码必须包含1-9之间的一位数字,一个小写字母,一个大写字母和一个下划线,长度必须为8-16个字符。任何其他特殊字符的使用和空格的使用都是可选的。

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

 

与模式 3 的区别

 

  • 在这里,我们没有使用&,这是在.(?=.*_)(?!.* )Pattern 3

 

  • 通过删除 ,不再强制传递一个下划线。现在,传递特殊字符是可选的。(?=.*_)

 

  • 通过删除 ,空间的使用也变得可选。(?!.* )

评论

0赞 user924 9/1/2023
尝试过说这是无效的JavaQwezxc123@Pattern.compile("/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\\W)(?!.* ).{8,16}\$/")
3赞 Stuepfnick 3/4/2023 #42

我会使用:

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

大多数答案都假设您使用他们预定义的特殊字符之一,但我会说,如果可以使用任何特殊字符,如果它不是 a-zA-Z0-9,那就更好了,所以你可以写成: ,但使用“Not Word”会更短: 这相当于: - 但当然,您希望下划线被视为特殊字符, 如此简单地添加它,然后你以:[^a-zA-Z0-9]\W[^a-zA-Z0-9_]_[\W_]

regex101 是一个非常好且有用的工具,用于构建您的个人正则表达式、修改或测试现有正则表达式: https://regex101.com

3赞 Raj 7/27/2023 #43

这对我有用:

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