我一直在尝试创建一个Regex,它可以检测长度在5到20个字符之间的字母数字密码。这些密码可以包含特殊字符(@$!%*#?&£
)。我的尝试无法检测到我所有的测试用例,或者它们会生成大量的误报。
正则表达式当前如下所示:
\b(?=.*[a-zA-Z])(?=.*\d*)(?=.*[@$!%*#?&£]*)[a-zA-Z\d@$!%*#?&£]{5,20}(?<![a-zA-Z ])\b
Here is my Regex running on Regexr with my test cases
正则表达式的标准如下:
@$!%*#?&£
等)在编写原始正则表达式时,我遇到了很多问题,无法应用字符边界,比如说一个单词是21个字符,我根本就不想检测到它。我基本上只想扫描此长度之间的项目,但是此边界已阻止检测到许多匹配项。
采用字符串“ Rese7”和“ Rese7A”。 第一个字符串与&&匹配,第二个不匹配,我怀疑这是因为我实现了字符检查的方式。我基本上希望正则表达式执行以下操作:
aA-zZ0-9!£$
等)我不确定是否正在考虑这项权利,我查看了其他字母数字密码问题,但答案似乎并不满足我的测试用例:
感谢您的帮助!
答案 0 :(得分:1)
在模式中,您可以使用这些肯定的前行(?=.*\d*)(?=.*[@$!%*#?&£]*)
,其中要声明的内容应与数字0+倍匹配,或使用星号*
匹配特殊字符。
因此,断言无论是否存在都将是正确的,这将永远为您提供比您期望更多的匹配项。
您可以使用锚点来声明字符串的开头^
和结尾$
,并忽略*
至少匹配1次以确保它在那里。
(?<![a-zA-Z ])
末尾的否定性确保左侧不是char a-zA-Z或空格。您可以通过不允许空格匹配来忽略它。
但是强制执行此规则将不允许rese7FwDdvgfe
进行匹配,但是在您的示例数据中,您确实希望对其进行匹配,因此您可以将后视保留在模式之外。
^(?=[^a-zA-Z\s]*[a-zA-Z])(?=(?:[^\d\s]*\d|[^\s@$!%*#?&£]*[@$!%*#?&£]))[@$!%*#?&£a-zA-Z\d]{5,20}$
说明
^
字符串的开头(?=[^a-zA-Z\s]*[a-zA-Z])
断言大写或小写a-z (?=
积极前瞻
(?:
非捕获组
[^\d\s]*\d
声明数字|
或[^\s@$!%*#?&£]*[@$!%*#?&£]
声明特殊字符)
关闭非捕获组)
积极回望[@$!%*#?&£a-zA-Z\d]{5,20}
匹配所有允许的5-20次$
字符串结尾答案 1 :(得分:0)
(?:^|[^a-zA-Z\d@$!%*#?&£])[a-zA-Z\d@$!%*#?&£]{5,20}(?:$|[^a-zA-Z\d@$!%*#?&£])
您需要的是字符串^
的开头,或者不是您的可匹配字符[^a-zA-Z\d@$!%*#?&£]
之一,然后是5至20个可匹配字符[a-zA-Z\d@$!%*#?&£]{5,20}
,然后是字符串{{ 1}}或一个不可匹配的字符$
。
正则表达式与您不想要的东西一样重要