Regex 在正则表达式中搜索字母数字密码
我一直在尝试创建一个正则表达式,它可以检测长度在5-20个字符之间的字母数字密码。这些密码可以包含特殊字符(Regex 在正则表达式中搜索字母数字密码,regex,regex-lookarounds,Regex,Regex Lookarounds,我一直在尝试创建一个正则表达式,它可以检测长度在5-20个字符之间的字母数字密码。这些密码可以包含特殊字符(@$!%*?&)。我的尝试要么没有检测到所有的测试用例,要么产生了大量的误报 正则表达式当前看起来如下所示: \b(?=.*[a-zA-Z])(?=.*\d*)(?=.*[@$!%*#?&£]*)[a-zA-Z\d@$!%*#?&£]{5,20}(?<![a-zA-Z ])\b \b(?=.[a-zA-Z])(?=..*\d*)(?=.[$!%*?&]*)[a-zA
@$!%*?&
)。我的尝试要么没有检测到所有的测试用例,要么产生了大量的误报
正则表达式当前看起来如下所示:
\b(?=.*[a-zA-Z])(?=.*\d*)(?=.*[@$!%*#?&£]*)[a-zA-Z\d@$!%*#?&£]{5,20}(?<![a-zA-Z ])\b
\b(?=.[a-zA-Z])(?=..*\d*)(?=.[$!%*?&]*)[a-zA-Z\d$!%*?&]{5,20}(?)?
正则表达式的标准如下:
- 检测长度在5到20个字符之间的混合字母数字字
- 检测特殊符号(
@$!%*?&
等)
在编写原始正则表达式时,我在应用字符边界时遇到了很多问题,比如说,如果一个单词是21个字符,我根本不希望它被检测到。我基本上只想扫描这个长度之间的项目,但这个边界阻止了许多匹配被检测到
以字符串“Rese7”和“Rese7A”为例。
第一个字符串匹配&&第二个不匹配,我怀疑这是因为我实现了字符检查。我基本上希望正则表达式执行以下操作:
- 将单词定义为任意字符(包括特殊字符)
- 查找长度在5-20个字符之间的单词
- 检查它们是否为字母数字(
aA-zZ0-9!£$
etc)
- 仅匹配符合此条件的单词
我不确定我是否正确思考了这一点,我看了其他字母数字密码问题,答案似乎不符合我的测试用例:
谢谢你的帮助
(?:^|[^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}
,然后是字符串$
的结尾,或者是一个不可匹配的字符[^a-zA Z-d$!%*?*!%>
正则表达式与你不想要的东西和你所做的事情一样重要,在你的模式中,你使用这些正面的外观头(?=.*\d*)(?=.[@$!%*.\\\\\\.&]*)
在这里,你想要断言的内容应该匹配0+倍的数字或使用asterix*
的特殊字符
因此,如果该断言存在或不存在,则该断言将为真,这将始终为真,为您提供比预期多得多的匹配项
您可以使用锚定来断言字符串的开始^
和结束$
,并省略*
以至少匹配1次以确保它在那里
(?结尾处的负查找确保左侧不是char a-zA-Z或空格。您可以通过不允许空格匹配来忽略这一点
但是强制执行此规则将不允许rese7fwdvgfe
匹配,但在示例数据中,您确实希望匹配它,以便可以将lookback排除在模式之外
^(?=[^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次
$
字符串结尾