ChatGPT解决这个技术问题 Extra ChatGPT

RegEx 确保字符串至少包含一个小写字符、大写字符、数字和符号

确保给定字符串至少包含以下每个类别中的一个字符的正则表达式是什么。

小写字符

大写字母

数字

象征

我知道各个集合的模式,即 [a-z][A-Z]\d_|[^\w](我猜对了,不是吗?)。

但是我如何组合它们以确保字符串以任何顺序包含所有这些?

什么平台/正则表达式方言? Bart 的回答是正确的,但是例如,前瞻断言在 JavaScript 中是不可靠的。
没有什么特别的 - 我正在学习正则表达式。有没有可以在 javascript 中使用的替代方法?
@bobince 嘿,我试图找出为什么前瞻断言在 Javascript 中不可靠。有这方面的文章吗?
@ChrisB:有一个非常令人困惑的 IE/JScript 错误:blog.stevenlevithan.com/archives/regex-lookahead-bug

B
Bart Kiers

如果您需要一个正则表达式,请尝试:

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W)

一个简短的解释:

(?=.*[a-z])        // use positive look ahead to see if at least one lower case letter exists
(?=.*[A-Z])        // use positive look ahead to see if at least one upper case letter exists
(?=.*\d)           // use positive look ahead to see if at least one digit exists
(?=.*\W)           // use positive look ahead to see if at least one non-word character exists

我同意 SilentGhost,\W 可能有点宽泛。我会用这样的字符集替换它:[-+_!@#$%^&*.,?](当然可以随意添加更多!)


如果我将最后一个 .+ 更改为 .* 会发生什么?我想不出一个因 .* 而失败的测试用例。在这种情况下它们是否相同? “零个或多个字符”似乎很好 - 只是寻求确认。
@Amarghosh:在这种情况下,没有区别。由于积极的前瞻,字符串已经包含至少 4 个字符。因此,将 .+ 更改为 .* 甚至 .{4,} 都没有区别。
如果您愿意添加一点解释,我很难理解这些前瞻的组合如何保证每个字符集至少有 1 个出现
@BartKiers 如果我不想要任何符号怎么办?删除 (?=.*[_\W]) 不起作用regex101.com/r/jH9rK1/1
@ikertxu,试试这样的:^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?!.*[&%$]).{6,}$
E
Elijah Mock

Bart Kiers,您的正则表达式有几个问题。最好的方法是:

(.*[a-z].*)       // For lower cases
(.*[A-Z].*)       // For upper cases
(.*\d.*)          // For digits
(.*\W.*)          // For symbols (non-word characters)

这样,无论是在开头、结尾还是中间,您都在搜索。在你有我有很多复杂密码的麻烦。


您没有按照 OP 的要求检查符号。
如果按此顺序找到小写字母、大写字母和数字,这只会起作用。例如 ist 不适用于 111aaqBBB
S
SilentGhost

您可以分别匹配这三个组,并确保它们都存在。此外,[^\w] 似乎有点过于宽泛,但如果这是您想要的,您可能希望将其替换为 \W


谢谢。我不知道\W。刚查了一下,发现它与 Not Word 匹配。 \W 和 [\W] 之间有什么区别吗? [\W] 只是多余的吗?
@Amarghosh,是的,\W[\W] 结果相同。
E
Ensei_Tankado

Bart Kiers solution 很好,但它错过了拒绝具有 空格 的字符串和接受具有 下划线 (_) 作为符号的字符串。

改进 Bart Kiers 解决方案,这里是正则表达式:

(?=.\d)(?=.[a-z])(?=.[A-Z])((?=.\W)|(?=.*_))^[^ ]+$

一个简短的解释:

(?=.*[a-z])        // use positive look ahead to see if at least one lower case letter exists
(?=.*[A-Z])        // use positive look ahead to see if at least one upper case letter exists
(?=.*\d)           // use positive look ahead to see if at least one digit exists
(?=.*\W)           // use positive look ahead to see if at least one non-word character exists
(?=.*_)           // use positive look ahead to see if at least one underscore exists
|           // The Logical OR operator
^[^ ]+$           // Reject the strings having spaces in them.

旁注:您可以在正则表达式 here 上尝试测试用例。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅