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


443

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

密码包含至少八个字符,包括至少一个数,并且包括下部和大写字母和特殊字符都,例如#?!

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

这是我的验证表达式,它包含八个字符,包括一个大写字母,一个小写字母以及一个数字或特殊字符。

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

如何编写密码,密码必须是八个字符,包括一个大写字母,一个特殊字符和字母数字字符

Answers:


1177

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

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

最少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,} $“
加文

412

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

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

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

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

71

正则表达式没有AND运算符,因此,当有效性是由AND和其他事物以及其他事物定义的时,很难编写与有效密码匹配的正则表达式。

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

任何少于八个字符什么没有数字没有大写什么什么的,没有小写不带特殊字符的任何东西。

所以:

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

如果符合条件,则为无效密码。


3
好吧,我是怕你的计算机科学家,我们有时会谁不知道有之间的差异的一个正则表达式正则表达式。;)的确,如果以后可以取消匹配结果,则许多正则表达式任务会简单得多,但这并不总是可能的。不过,这是一个美丽的正则表达式。这不简单,很优雅!
艾伦·摩尔

1
为什么我以前没有想过?很好的答案(可能会否定结果)
TeChn4K '16

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]*
我-

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,2016年

我非常喜欢这个答案,除了它不能接受下划线。我所做的只是替代(?=.*?[^\w\s])(?=.*?([^\w\s]|[_]))补充的下划线的支持,现在的伟大工程。另外,我使用@ Dinish.net时,我使用的系统会在密码字符串中删除空格,因此,如果要使用此答案,则使用香草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. 最少6个字符,最多16个字符

表达:

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

如果不需要最小和最大条件,则删除 .{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

我会回覆彼得·莫滕森(Peter Mortensen),但我的声誉不高。

他的表情非常适合每个指定的最低要求。他不需要特殊字符的表达式的问题在于它们也不允许特殊字符,因此它们也强制执行最高要求,我不认为OP会要求这样做。通常,您希望允许用户设置他们想要的密码。为什么限制强密码?

因此,他的“最少八个字符,至少一个字母和一个数字”的表达是:

^(?=.*[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,} 允许使用特定的特殊字符。


感谢您的解释。
海阮

应该将其标记为正确答案。最高答案是错误的。
杰克

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个特殊字符的强制条件适用于所有人。等待你的应对....
沙善HONRAO

1
@SHASHANKHONRAO我将表达式更新为:^(?=。* [az])(?=。* [AZ])(?=。* \ d)(?=。* [$ @ $!%*?&+ 〜|{}:;<>/])[A-Za-z\d$@$!%*?&+~| {}:; <> /] {8,15},其中将包含以下非字母数字字符:(@ $!%*?&+
〜`

5

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

^(?=.*[\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. 没有具体指定符号,这也是因为不同的语言环境可能希望在其键盘上使用不同的符号。

即使在密码中包含空格的情况下,此正则表达式仍对我不起作用
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

我们可以使用HTML5做到这一点。

在pattern属性中使用以下代码,

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

我实际上只是在这里复制了第一个答案,然后将其转换为更方便使用的正则表达式,它需要一个上,一个下和至少8个字符,但可以接受“中间”的所有内容。

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

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

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

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

注意“。” 正则表达式末尾的alomst。这将匹配几乎所有(和afaik任何可读的)字符


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.