正则表达式至少8个字符,字母旁边加上数字或符号或两者兼而有之

时间:2019-07-02 17:53:27

标签: javascript regex typescript

应满足的示例: test @ 1234(接受) TestTo ^ 12(接受) 测试!5655(接受) 测试!@ $&(接受) testtesttest(不应接受) 在字母旁边,我希望至少有一个数字或符号。如果两者都可用,那很好。

1 个答案:

答案 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个字符。但是 情况变得更糟 。为了使密码更容易记忆,很多人都遵循以下模式:

  • 在数字上打个招呼(“ honeybee326”)
  • 一个字并用符号替换一些字母(“ unf @ th0m @ ble”)
  • 在符号上措手不及(“ mypassword!”)

尝试猜测密码的人们无需尝试 字母,数字和符号的所有可能组合 。他们只需要尝试这些模式。这样可以大大减少破解密码所需的时间。

任何真正了解其安全知识的安全专家都会告诉您:强密码的秘密是 长密码 。这意味着:

  

你好,我叫史蒂文,我喜欢安全性

比99999999x更安全:

  

8j3 @ vk; 8]

如果您想真正地 来确保人员安全,则建议不要使用大的长度要求(例如15个字符),而不是测试符号或数字。或者,只需告诉他们您的建议,然后让他们做自己认为最好的事情(如果他们选择了错误的密码,则只有他们自己承担后果)。除非这是一个管理员密码,否则必须设置一个很大的长度。