ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

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

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


W
Wiktor Stribiżew

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

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

"^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$" 不允许符号作为 8 个字符之一
我发现所有字符(特殊和标点符号)都允许使用以下内容,但没有强制要求:“^(?=.*[az])(?=.*[AZ])(?=.*\d)[a- zA-Z\d\w\W]{8,}$"
@Gavin使用此正则表达式,字符串“DdBxgyZv2FBaa”是有效的,但不应被检测为有效,因为没有特殊字符。
a
anubhava

您可以将此正则表达式与多个 lookahead assertions (conditions) 一起使用:

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

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

至少一个大写英文字母,(?=.*?[AZ])

至少一个小写英文字母 (?=.*?[az])

至少一位数,(?=.*?[0-9])

至少一个特殊字符 (?=.*?[#?!@$%^&*-])

长度至少为 8 .{8,} (带有锚点)


正则表达式的详细答案
P
Peter Mortensen

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

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

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

所以:

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

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


这是更好的答案之一。其他答案不包括“(”或“)”等特殊字符。很好的解决方案!
P
Peter Mortensen

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

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

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

至少一个大写英文字母

至少一个小写英文字母

至少一位数

至少一个特殊字符

最少八长


在 JavaScript 风格中,\W 仅匹配 ASCII 字符。所以你没有改变它,现在你必须过滤掉空白字符。此外,您添加的所有括号和 {1,} 量词都是纯噪声,删除非贪婪 (?) 运算符是没有意义的。这里没有改进。
要将下划线也视为特殊字符并进行其他一些改进,请尝试例如:^(?=[^A-Z\s]*[A-Z])(?=[^a-z\s]*[a-z])(?=[^\d\s]*\d)(?=\w*[\W_])\S{8,}$
H
HK boy

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

条件:

最少 1 个大写字母。最少 1 个小写字母。最少 1 个特殊字符。最少 1 个数字。最少 8 个字符。最多 30 个字符。

正则表达式:

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

你的答案在哪方面比几年前写的其他答案更好?
@JoshYates1980,您能否提及正则表达式失败的“特殊字符”。让我验证并相应地更新它。但据我所知,它适用于所有符合 1 个特殊字符的任务条件。等待您的回复......
@SHASHANKHONRAO 我将表达式更新为: ^(?=.*[az])(?=.*[AZ])(?=.*\d)(?=.*[$@$!%*?& +~|{}:;<>/])[A-Za-z\d$@$!%*?&+~|{}:;<>/]{8,15} 将包括以下非字母数字字符:(@$!%*?&+~`|{}:;<> /)
s
scniro

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

至少 8 个字符

至少 1 个数字字符

至少 1 个小写字母

至少 1 个大写字母

至少 1 个特殊字符

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

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


好东西。但是发现了一个问题,即您的正则表达式不接受 _(underscore) 作为特殊字符 :( 。
我真的很喜欢这个答案,只是它不能接受下划线。我所做的只是将 (?=.*?[^\w\s]) 替换为 (?=.*?([^\w\s]|[_])) 以添加对下划线的支持,现在效果很好。同样@Dinish.net,我使用的系统在我们获取密码字符串时会从密码字符串中删除空格,因此如果您想使用此答案,使用 vanilla JS String.prototype.trim() 方法会很好。
S
SamWhan

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

^(?=\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*[az])(?=\S*[AZ])(?=\S*\d)(?=\S*[^\w\s])\ S{8,}$/; pwdList.forEach(function (pw) { document.write('' + pw + '
'); });


d
deathwombat

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

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


P
Peter Mortensen

导入 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)
});

至少一个大写英文字母 至少一个小写英文字母 至少一个数字 至少一个特殊字符


S
Sazzad

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

至少 1 个字母

至少 1 位数

不包含空格

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

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

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


P
Peter Mortensen

试试这个:

最少六个字符 至少一个大写字符 至少一个小写字符 至少一个特殊字符

表达:

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

可选特殊字符:

至少 1 个特殊字符 至少 1 个数字 特殊字符可选 最少 6 个字符,最多 16 个字符

表达:

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

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

6 是最小字符限制

20 是最大字符限制

?= 表示匹配表达式


D
Dana

这对我有用:

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

至少 8 个字符长;

一个小写,一个大写,一个数字和一个特殊字符;

没有空格。


是的,它在空格中变得错误
H
Heikki Salokanto

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

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

E
Emerson Joel Rojas Soliz

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

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

这验证了以下内容:

至少一个小写字母 至少一个大写字母 至少一个数字 至少一个特殊字符 至少应该有 8 个字符长。

在以下链接中检查它是否有效 https://regex101.com/r/qPmC06/4/


您建议的正则表达式和 regex101 链接下的正则表达式有所不同。不应该是^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W\_])[A-Za-z\d\W\_]{8,}$吗?
S
Steve Johnson

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

至少一个大写字符 至少一个小写字符 至少一个数字 至少一个符号/特殊字符 @$!%*#?&^_- 至少 8 个字符/数字

正则表达式:

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

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


M
Milan Paudyal
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+,.\\\/;':"-]).{8,}$
    

T
The fourth bird

另一种选择是在使用 negated character class 的前瞻断言中使用 contrast,可选择匹配除在匹配应匹配字符之前列出的任何字符之外的任何字符。

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

查看regex demo

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

^ 字符串开头

(?=[^AZ\n]*[AZ]) 正向前瞻,断言 0+ 次除 AZ 或换行符之外的任何字符。然后匹配一个 char AZ

(?=[^az\n]*[az]) 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 正则表达式 = /^(?=[^AZ\n]*[AZ])(?=[^az\n]*[az])(?=[^0-9\n]*[0-9] )(?=[^#?!@$%^&*\n-]*[#?!@$%^&*-]).{8,}$/; [“abcA1#!A”、“#!asdfSFD1;”、“#af F1;”、“1111111111”、“aaaaaaaa”、“11111111”、“AAAAAAA”、“########”、“ aA1#" ].forEach(s => console.log(regex.test(s) ? `Match --> ${s}` : `No match --> ${s}`) );


H
Hasan Tezcan
/^(?=.*[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'
    ),

M
MiKr13

在 2020 年测试这个:

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

验证自己

const 正则表达式 = /^(?=.*[az])(?=.*[AZ])(?=.*\d)(?=.*[@$!%*?&])[A-Za -z\d@$!%*?&]{8,}$/; const str = `some12*Nuts`;让 m; if ((m = regex.exec(str)) !== null) { // 可以通过 `m` 变量访问结果。 m.forEach((match, groupIndex) => { console.log(`找到匹配,组 ${groupIndex}: ${match}`); }); }


S
Sadia Younas

必须包含至少 1 个数字、1 个大写字母、1 个小写字母和至少 8 个或更多字符:https://www.w3schools.com/howto/howto_js_password_validation.asp

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

R
Rasaf Ibrahim

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

模式一:

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

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

解释:

(?=.*[0-9]) 表示密码必须包含从 1 到 9 的单个数字。

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

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

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

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

什么是 ^$

^ 表示字符串的开头。 $ 表示字符串的结尾。

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

删除最大长度限制:

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

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

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

不接受任何特殊字符:

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

数字(数字)的替代语法:

代替 (?=.*[0-9]),我们可以使用 (?=.*\d)。 (?=.*\d) 也意味着密码必须包含从 1 到 9 的单个数字。

模式二:

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

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

与模式 1 的区别

在这里,我们使用了模式 1 中没有的 (?=.*_)。

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

模式3:

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

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

与模式 2 的区别

在这里,我们没有使用 (?!.*\W) 模式 2 中的内容。

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

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

模式4:

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

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

与模式3的区别

在这里,我们没有使用模式 3 上的 (?=.*_) & (?!.* )。

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

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


P
Peter Mortensen

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

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

S
SONewbiee

@ClasG 已经suggested

^(?=\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,}$

S
Stefano

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

这是它的荣耀,有测试:

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

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

需要注意的事项:

不使用 \w,因为它包括我正在测试的 _。我在匹配符号时遇到了很多麻烦,但没有匹配行尾。没有具体指定符号,这也是因为不同的语言环境可能在他们的键盘上有不同的符号,他们可能想要使用。


M
Mohideen bin Mohammed

演示:

function password_check() { pass = document.getElementById("password").value;控制台.log(通过);正则表达式 = /^(?=.*[az])(?=.*[AZ])(?=.*\d)(?=.*[@$!%*?&])[A-Za- z\d@$!%*?&]{8,}$/; if (regex.exec(pass) == null) { alert('无效密码!') } else { console.log("valid"); } }


M
Masoud
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


这些正则表达式的条件是什么?
我认为您的 mediumRegex 变量正在检查至少 6 个字符,而不是 8 个
M
Mosia Thabo

保持简单愚蠢:

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

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

如果您的密码与上面的正则表达式匹配,则它是无效的。

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

正则表达式的细分

.{0,7} - 如果密码包含 0 到 7 个字符,则匹配。 [^az]{1,} - 如果没有找到小写则匹配 [^AZ]{1,} - 如果没有找到大写则匹配 [^\d]{1,} - 如果没有数字则匹配(在 [0 -9]) is found [\s] - 如果找到空格、制表符或换行符,则匹配。

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


M
Mike G
(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+-]).{6}

S
Samrat Saha

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

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


V
Vidya

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

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

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

它将完美地工作。