【问题标题】:regex to restrict special characters except few正则表达式限制特殊字符,除了少数
【发布时间】:2021-11-21 22:44:25
【问题描述】:
我能够编写一个正则表达式来验证输入框的以下条件。
- 至少包含 14 个字符
- 至少包含 1 个大写字母 (A-Z)
- 至少包含 1 个简单字母 (a-z)
- 至少包含 1 个数字 (0-9)
- 至少包含 1 个特殊符号 (+=!@#$%^&*)
正则表达式 -> ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[+=!@#$%^&*])(?=\\S+$).{14,}$
但是,此正则表达式允许其他未提及的特殊字符。我想限制除这些+=!@#$%^&*之外的所有特殊字符
有人可以帮我用上述标准修改给定的正则表达式吗?
【问题讨论】:
标签:
javascript
regex
regex-negation
【解决方案1】:
您可以使用字符集将允许的字符限制为特定集,而不是允许任何字符的.:
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[+=!@#$%^&*])(?=\\S+$)[0-9A-Za-z+=!@#$%^&*]{14,}$
【解决方案2】:
为什么不用集合而不是正则表达式:
import string
upperSet = set(string.ascii_uppercase)
lowerSet = set(string.ascii_lowercase)
numberSet = set("0123456789")
specialSet = set("+=!@#$%^&*")
allSets = [upperSet,lowerSet,numberSet,specialSet]
validSet = set().union(*allSets)
isValid = len(pw)>=14 and validSet.issuperset(pw) \
and all(s.intersection(pw) for s in allSets)
您还可以使用 translate 方法将每组字符转换为四个代码,然后检查它们是否完全存在于翻译后的字符串中:
validCheck = str.maketrans(string.ascii_letters + "0123456789" + "+=!@#$%^&*",
"1"*26+"2"*26+"3"*10+"4"*10)
isValid = len(pw)>=14 and set('1234') == set(pw.translate(validCheck))))