【问题标题】:regex for minimum 8 character,beside letters add number or symbol or both [duplicate]最少8个字符的正则表达式,在字母旁边添加数字或符号或两者[重复]
【发布时间】:2019-11-13 09:57:10
【问题描述】:

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

【问题讨论】:

  • 到目前为止有什么努力吗?请发布尝试过的代码
  • 你应该只用谷歌搜索“密码正则表达式”之类的东西,你会发现很多满足你需求的例子。

标签: javascript regex typescript


【解决方案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!”)

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

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

你好,我叫 Steven,我喜欢安全

比以下安全 99999999 倍:

8j3@vk;8]

如果您想真正确保人们的安全,我建议您只设置较大的长度要求(例如 15 个字符),而不是测试符号或数字。或者,只是告诉他们你的建议,让他们做他们认为最好的事情(如果他们选择了错误的密码,只有他们承担后果)。除非这是一个管理员密码,在这种情况下强制执行一个很大的长度。

【讨论】:

  • 当你使用两个单独的正则表达式时,最好使用myValue.length === 8而不是/.{8}/.test(myValue)
  • @CodeManiac 非常好。我在想正则表达式和derp'd
  • 嗨,第一个正则表达式大的几乎在所有情况下都可以工作,但很少有人像 testtest1,testtest@..... 你能帮我解决这个问题吗??
  • @riyatolia 当我在 Google Chrome 控制台中输入 /([^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])/.test("testtest1,testtest@") 时,它似乎可以工作(返回 true)。你在哪里使用它,它不起作用?
猜你喜欢
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多