Linux环境grep匹配含字母数字特殊字符的密码正则不生效求助
正则匹配失败原因分析
- 原正则的
{10,}量词作用对象错误:该量词修饰的是前面的整个分组((\w*)([$%*@#]+)(\w+)),要求该分组完整重复至少10次,而非要求整个字符串长度≥10,完全不符合长度校验的预期。 - 缺少强制匹配字母、数字的校验逻辑:原正则仅能保证存在
$%*@#范围内的特殊字符,无法限制必须同时包含字母和数字,会出现仅含特殊字符+数字、仅含特殊字符+字母的字符串被误匹配的问题。 \w匹配范围可选注意项:Linux环境下\w默认匹配英文字母、数字、下划线,若你不允许密码包含下划线,该字符类也会导致误匹配。
适配Linux环境的正确正则及用法
推荐使用支持PCRE(Perl兼容正则表达式)的模式实现多条件校验,正确正则如下:
^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[$%*@#]).{10,}$
各部分逻辑说明:
^/$:分别匹配字符串的开头和结尾,确保整行/整个字符串完全符合规则(?=.*[a-zA-Z]):正向先行断言,要求字符串中至少存在1个英文字母(?=.*[0-9]):正向先行断言,要求字符串中至少存在1个数字(?=.*[$%*@#]):正向先行断言,要求字符串中至少存在1个指定的特殊字符.{10,}:匹配任意字符最少10次,满足最小长度要求
Linux下使用示例(以grep为例):
需要加-P参数启用PCRE模式,扫描目标文件的命令如下:grep -P '^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[$%*@#]).{10,}$' 待扫描的文件路径
内容的提问来源于stack exchange,提问作者Jenifer P
相关产品推荐
相关产品推荐

