正则表达式检查字符串中的唯一字符和禁止字符

Posted

技术标签:

【中文标题】正则表达式检查字符串中的唯一字符和禁止字符【英文标题】:Regex to check string for unique characters and prohibited characters 【发布时间】:2011-08-18 17:13:33 【问题描述】:

我正在编写一个密码验证正则表达式,我已经成功完成了 80-90% 的工作,但无法合并我需要的最后两部分,我厌倦了用头撞墙所以这就是你们进来的地方;)

到目前为止,这是我的表达:

^(?!.*(.)\13).*(?=.8,)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\Q~!@#$%^&*()-_=+[]|;:,.<>/?\E]).*$

所以我有以下规则:

    (?!.*(.)\13) - 序列中相同字符不超过 3 个 .*(?=.8,) - 字符串必须至少为 8 个字符 (?=.*\d) - 必须至少包含一位数字 (?=.*[a-z]) - 必须至少包含一个小写字母 (?=.*[A-Z]) - 必须至少包含一个大写字母 (?=.\*[\Q~!@#$%^&amp;*()-_=+[]|;:,.&lt;&gt;/?\E]) - 必须至少包含这些特殊字符之一

我需要再添加两个限制

1) 字符串中不得出现除字母数字或我的特殊字符之一以外的字符。所以我认为我的基本表达是正确的:

^([\w\Q~!@#$%^&*()-_=+[]|;:,.<>/?\E]*)$

但是当我尝试将它添加到我的整体表达中时它不起作用或者它搞砸了我的其他条件之一,所以我不确定我做错了什么

2) 字符串必须包含 4 个唯一字符。我根本想不通。

提前感谢您提供的任何帮助

【问题讨论】:

您应该对每个要求使用单独的检查。那个正则表达式是一个不容易维护的怪物。 【参考方案1】:

试试这个。 (我删除了几个不需要的 .*s 并删除了至少 8 个字符,因为它们可以合并到最后的部分中。)

^
(?!.*(.)\13)
(?=.*\d)
(?=.*[a-z])
(?=.*[A-Z])
(?=.*[\Q~!@#$%^&*()-_=+[]|;:,.<>/?\E])
[\w\Q~!@#$%^&*()-_=+[]|;:,.<>/?\E]8,
$

另外,你的最后一条规则:

字符串必须包含 4 个唯一字符。

已检查,因为您请求的是一位数字、一位高位、一位低位和一位特殊 = 四种不同的类别。

【讨论】:

这就是这个社区如此伟大的原因,它是第二双眼睛,可以用全新的眼光看待你已经凝视了几个小时的东西,你对最后一条规则是绝对正确的!这是我使用的表达式: ^(?!.*(.)\13).*(?=.8,)(?=.*\d)(?=.*[a-z] )(?=.*[A-Z])(?=.*[\Q~!@#$%^&*()-_=+[]|;:,./?\E]) .*[\w\Q~!@#$%^&*()-_=+[]|;:,./?\E]8,$ 不幸的是,您的正则表达式不起作用。它将'4mM-~asdfdasf4mM-~'asdfdasf4mM-~ asdfdasf 验证为有效密码。这是因为你的错误.* 徘徊并捕获无效字符。

以上是关于正则表达式检查字符串中的唯一字符和禁止字符的主要内容,如果未能解决你的问题,请参考以下文章

java:正则表达式检查SQL WHERE条件语句防止注入攻击和常量表达式

使用正则表达式检查字符串中的第三个字符

正则表达式 - 禁止任何大小的字符串重复只包含一个字符

如何检查字符串是不是匹配数组中的正则表达式之一?

如何检查字符串是不是与 Thymeleaf 中的正则表达式匹配?

js 正则表达式禁止输入框输入特殊字符遇到的坑以及解决方案