705

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

密码至少包含八个字符,其中至少包含一个数字,并且同时包含大小写字母和特殊字符,例如#, 。?!

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

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

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

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

4

40 回答 40

1790

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

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

最少 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}$"
于 2014-01-30T12:44:17.457 回答
621

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

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

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

  • 至少一个大写英文字母(?=.*?[A-Z])
  • 至少一个小写英文字母,(?=.*?[a-z])
  • 至少一位数,(?=.*?[0-9])
  • 至少一个特殊字符,(?=.*?[#?!@$%^&*-])
  • 至少八长.{8,}(带锚)
于 2013-10-26T09:48:45.187 回答
98

正则表达式没有 AND 运算符,因此很难编写匹配有效密码的正则表达式,当有效性由某物和其他东西和其他东西定义时......

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

任何少于八个字符的内容任何没有数字的内容任何没有大写的内容任何没有小写的内容任何没有特殊字符的内容。

所以:

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

如果有任何匹配,那么它是一个无效的密码。

于 2015-11-08T01:56:39.793 回答
46

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

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

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

  • 至少一个大写英文字母
  • 至少一个小写英文字母
  • 至少一位数
  • 至少一个特殊字符
  • 最少八长
于 2014-01-10T19:11:41.493 回答
43

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

条件:

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

正则表达式:

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#$@!%&*?])[A-Za-z\d#$@!%&*?]{8,30}$/
于 2017-07-13T12:39:54.593 回答
37

对于我的情况,我在遵循最流行的答案时遇到了一些困难。例如,我的验证因使用;or等​​字符而失败[。我对将我的特殊字符列入白名单不感兴趣,因此我将[^\w\s]其用作测试 - 简单地说 - 匹配非单词字符(包括数字)和非空白字符。总而言之,这对我有用...

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

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

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

于 2015-10-23T00:05:03.860 回答
19

一个更“通用”的版本(?),允许没有英文字母作为特殊字符

^(?=\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/>');
  });

于 2017-09-26T13:23:14.977 回答
19

我会回复彼得莫滕森,但我没有足够的声誉。

他的表情非常适合每个指定的最低要求。他的不需要特殊字符的表达式的问题是它们也不允许特殊字符,因此它们也强制执行最大要求,我不相信 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,}允许特定的特殊字符。

于 2018-04-08T18:21:19.683 回答
14

导入 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. 至少一个特殊字符
于 2014-04-24T12:16:24.543 回答
12

试试这个:

  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}$/"

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

  • 6是最小字符限制
  • 20是最大字符限制
  • ?=表示匹配表达式
于 2016-10-19T15:51:26.323 回答
11

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

  • 至少 1 个字母

  • 至少 1 位数

  • 不包含空格

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

  • 最少 8 个字符长

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

您还可以设置上限,例如 {8,32} 最长为 32 个字符。

于 2021-08-01T15:55:39.860 回答
10

这对我有用:

^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@$!%*?&])([a-zA-Z0-9@$!%*?&]{8,})$
  • 至少 8 个字符长;
  • 一个小写,一个大写,一个数字和一个特殊字符;
  • 没有空格。
于 2020-06-28T14:48:21.473 回答
10

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

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

这验证了以下内容:

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

在以下链接中检查它 ht ​​tps://regex101.com/r/qPmC06/4/

于 2019-12-03T20:04:47.830 回答
9

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

我曾经做过很多 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
}
于 2017-08-21T06:58:19.617 回答
9

对于需要以下内容的更严格的验证:

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

正则表达式:

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

我希望它可以帮助更严格的人。

于 2021-11-02T08:59:18.350 回答
9
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+,.\\\/;':"-]).{8,}$
    
于 2020-10-07T09:13:48.977 回答
5
/^(?=.*[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'
    ),
于 2020-12-17T10:48:24.577 回答
4

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

于 2020-06-04T14:19:44.420 回答
4
pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}"
于 2020-06-18T23:24:42.300 回答
3

保持简单愚蠢:

这应该永远为您解决问题。

正则表达式:^(.{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].

于 2021-11-26T15:06:15.957 回答
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);
}
于 2016-06-30T05:09:27.807 回答
3

演示:

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

于 2019-11-14T07:20:53.867 回答
3

@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,}$
于 2017-12-28T22:48:49.653 回答
3
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

于 2021-01-03T19:12:12.243 回答
3

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

这是它的荣耀,有测试:

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

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

需要注意的事项:

  1. 不使用\w,因为这包括_我正在测试的。
  2. 我在匹配符号时遇到了很多麻烦,但没有匹配行尾。
  3. 没有具体指定符号,这也是因为不同的语言环境可能在他们的键盘上有不同的符号,他们可能想要使用。
于 2018-12-19T17:04:36.977 回答
3

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

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

查看正则表达式演示

在部分情况下,模式匹配:

  • ^字符串的开始
  • (?=[^A-Z\n]*[A-Z])正向前瞻,断言 0+ 次除 AZ 或换行符之外的任何字符。然后匹配一个 char AZ
  • (?=[^a-z\n]*[a-z])char az 的相同方法
  • (?=[^0-9\n]*[0-9])数字 0-9 的相同方法
  • (?=[^#?!@$%^&*\n-]*[#?!@$%^&*-])您认为特殊的 char 方法相同
  • .{8,}匹配除换行符以外的任何字符 8 次或更多次
  • $字符串结束

笔记

  • 一个点也可以匹配一个空格。如果您不想允许匹配空格,则.{8,}可以更改\S{8,}为匹配 8 个或更多非空白字符
  • 使用.\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}`)
);

于 2021-12-13T17:31:58.540 回答
2
(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+-]).{6}
于 2015-11-03T17:49:49.293 回答
1

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

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

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

重要提示:这个正则表达式也将除了所有其他字符,例如数字,特殊字符,如 $,#,!等等- 只要规则 1. 到 3. 匹配输入字符串

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

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

于 2019-08-22T00:32:56.547 回答
1

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

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

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

它将完美地工作。

于 2018-05-16T12:14:22.757 回答
1

模式匹配至少 1 个大写字符、1 个数字和任何特殊字符,长度在 8 到 63 之间。

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

此模式用于 JAVA 编程。

于 2018-03-19T09:04:49.547 回答
1

用这个,

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

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

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

于 2019-11-30T12:47:26.037 回答
1

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

((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&*()]).{8,20})
于 2018-07-30T11:12:15.917 回答
1
(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$

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

于 2018-11-22T08:25:29.920 回答
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

于 2018-04-26T08:02:28.723 回答
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);
}
于 2017-03-23T10:30:54.697 回答
0

希望下面的作品。我在 Azure 自定义策略中试过这个。

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@#$%^&amp;*\-_+=[\]{}|\\:',?/`~&quot;();!])([A-Za-z\d@#$%^&amp;*\-_+=[\]{}|\\:',?/`~&quot;();!]|\.(?!@)){6,16}$
于 2018-08-13T07:12:06.413 回答
0

如果你不喜欢使用正则表达式。所以这个模块有很大帮助: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
于 2021-09-19T01:18:17.220 回答
0

在 Java/Android 中,要测试一个至少包含一个数字、一个字母、一个特殊字符的密码,模式如下:

"^(?=.*[A-Za-z])(?=.*\\d)(?=.*[$@$!%*#?&])[A-Za-z\\d$@$!%*#?&]{8,}$"
于 2016-08-05T11:34:19.457 回答
-1

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

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

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

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

"^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@$!%*?&]){8,}"
于 2017-04-05T15:36:39.100 回答
-2
     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.');
于 2021-02-05T07:25:52.720 回答