应满足的示例: test @ 1234(接受) TestTo ^ 12(接受) 测试!5655(接受) 测试!@ $&(接受) testtesttest(不应接受) 在字母旁边,我希望至少有一个数字或符号。如果两者都可用,那很好。
答案 0 :(得分:1)
使用单正则表达式解决方案进行了更新:
因为任何字符都可能是非字母的,所以要测试8个字符并确保其中至少一个不是字母同时需要更复杂的正则表达式。 “笨拙而直接”的解决方案是对8种可能性使用大量的“或”运算:
它看起来像这样:
var myRegex = /([^A-Za-z].{7})|(.[^A-Za-z].{6})|(.{2}[^A-Za-z].{5})|(.{3}[^A-Za-z].{4})|(.{4}[^A-Za-z].{3})|(.{5}[^A-Za-z].{2})|(.{6}[^A-Za-z].)|(.{7}[^A-Za-z])/
更智能的解决方案使用Regular Expression look-ahead operations。我们基本上会匹配一个空字符串,后跟8个字符,只要该空字符串后接一个包含(在其中的任何位置)非字母字符的模式:
var myRegex = /(?=.*[^A-Za-z]).{8}/;
先行检查会使常规工作变得更难以理解和调试,因此有时最好将问题改写为多部分检查(例如,先检查8个字符,然后 然后 检查是否有非字母字符)。因此,我的原始答案是:
原始(并且仍然完全有效):
这可能不是首选的解决方案,但这可能最容易用两个正则表达式解决:
var myValue = "testtesttest";
if (
/.{8}/.test(myValue) &&
/[^A-Za-z]/.test(myValue)
)
{
// At least 8 characters and contains one non-alphabetic character
}
else
{
// One of the two tests failed
}
当然/.{8}/.test(myValue)
只是myValue.length >= 8
,它的运行速度更快而且更易于阅读:
if (
myValue.length >= 8 &&
/[^A-Za-z]/.test(myValue)
)
...
有关密码安全性的说明:
复杂密码不是安全密码
让我重申一下:
当密码很复杂时,人们将不记得它了。因为他们不记得了,所以他们要么必须使用密码管理工具(如果他们很聪明),要么更有可能是 将它们写下在便条纸上 强>。但情况变得更糟。当您需要符号和数字时,很难输入密码,因此人们通常使它们尽可能短。您限制为8个字符? 他们的密码将是8个字符。但是 情况变得更糟 。为了使密码更容易记忆,很多人都遵循以下模式:
尝试猜测密码的人们无需尝试 字母,数字和符号的所有可能组合 。他们只需要尝试这些模式。这样可以大大减少破解密码所需的时间。
任何真正了解其安全知识的安全专家都会告诉您:强密码的秘密是 长密码 。这意味着:
你好,我叫史蒂文,我喜欢安全性
比99999999x更安全:
8j3 @ vk; 8]
如果您想真正地 来确保人员安全,则建议不要使用大的长度要求(例如15个字符),而不是测试符号或数字。或者,只需告诉他们您的建议,然后让他们做自己认为最好的事情(如果他们选择了错误的密码,则只有他们自己承担后果)。除非这是一个管理员密码,否则必须设置一个很大的长度。