更新了一个正则表达式解决方案:
因为 任何字符 都可能是非字母字符,因此测试 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 个字符。但是情况会变得更糟。许多人为了让密码更容易记住,遵循以下模式:
- 输入一个单词并添加一个数字(“honeybee326”)
- 取一个单词并用符号(“unf@th0m@ble”)替换一些字母
- 输入一个单词并添加一个符号(“mypassword!”)
尝试猜测密码的人无需尝试字母、数字和符号的所有可能组合。他们只需要尝试这些模式。这大大减少了破解密码所需的时间。
任何真正了解其资料的安全专家都会告诉您:强密码的秘诀是长密码。这意味着:
你好,我叫 Steven,我喜欢安全
比以下安全 99999999 倍:
8j3@vk;8]
如果您想真正确保人们的安全,我建议您只设置较大的长度要求(例如 15 个字符),而不是测试符号或数字。或者,只是告诉他们你的建议,让他们做他们认为最好的事情(如果他们选择了错误的密码,只有他们承担后果)。除非这是一个管理员密码,在这种情况下强制执行一个很大的长度。