regex - 在正则表达式中搜索字母数字密码
问题描述
我一直在尝试创建一个可以检测长度在 5-20 个字符之间的字母数字密码的正则表达式。这些密码可以包含特殊字符 ( @$!%*#?&£
)。我的尝试要么没有检测到我的所有测试用例,要么会产生大量误报。
正则表达式目前看起来像这样:
\b(?=.*[a-zA-Z])(?=.*\d*)(?=.*[@$!%*#?&£]*)[a-zA-Z\d@$!%*#?&£]{5,20}(?<![a-zA-Z ])\b
正则表达式的标准如下:
- 检测 5 到 20 个字符长之间的混合字母数字单词
- 检测特殊符号(
@$!%*#?&£
等)
在编写原始正则表达式时,我在应用字符边界时遇到了很多问题,比如说如果一个单词是 21 个字符,我根本不希望它被检测到。我基本上只想扫描这个长度之间的项目,但是这个边界已经阻止了许多匹配被检测到。
取字符串“Rese7”和“Rese7A”。第一个字符串匹配 && 第二个不匹配,我怀疑这是因为我如何实现字符检查。我基本上希望正则表达式做以下事情:
- 将单词定义为任何字符(包括特殊字符)
- 查找长度在 5-20 个字符之间的单词
- 检查它们是否是字母数字(
aA-zZ0-9!£$
等) - 仅匹配满足此条件的单词
我不确定我是否考虑到这一点,我查看了其他字母数字密码问题,但答案看起来并不能满足我的测试用例:
谢谢你的帮助!
解决方案
在您的模式中,您使用这些积极的前瞻(?=.*\d*)(?=.*[@$!%*#?&£]*)
,您想要断言的内容应该匹配 0+ 次数字或使用 asterix 的特殊字符*
。
因此,如果它存在或不存在,断言将是正确的,这将永远是正确的,给你比你预期的更多的匹配。
您可以使用锚来断言字符串的开头^
和结尾$
,并省略*
以匹配它至少 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])
断言大写或小写 az(?=
积极前瞻(?:
非捕获组[^\d\s]*\d
断言一个数字|
或者[^\s@$!%*#?&£]*[@$!%*#?&£]
断言一个特殊的字符
)
关闭非捕获组
)
关闭正向前瞻[@$!%*#?&£a-zA-Z\d]{5,20}
匹配所有允许的 5 - 20 次$
字符串结束
推荐阅读
- xamarin - 如何在 Xamarin.Forms 中为 StackLayout 正确创建自定义渲染器?
- java - 通过 Java Webapp 从查询中下载非常大的结果
- aws-cdk - 如何在 CDK 打字稿的 addToPolicy 方法中添加 sid
- vba - 尝试循环 IF(工作表中的 MID 函数
- bash - 处理完`-c`命令后如何保留bash shell
- python - 如何使用python运行特定文件
- python-3.x - 根据每组的第一行在熊猫数据框中创建一列
- javascript - 反应原生异步存储和 apollo-link 控制台日志未在承诺中调用
- arrays - 在 Google 表格中的 2 个值之间自动填充
- r - 如何在 kableExtra 脚注中引用参考文献?