超好用的正则表达式在线测试工具,以及关于正则表达式中零宽断言的理解
关于正则表达式各种字符的含义运用可见菜鸟教程 点击看文档
- 测试工具分享https://regex101.com/
基本的快速判断表达式是否合法不用多做说明
亮点示例:匹配邮箱格式的字符串,表达式的关联部分高亮,并且hover在上面可以看到各处字符的用途
更棒的是右侧有详细解析,分析该正则表达式! - 帮助理解正则表达式的路线图生成工具:https://regexper.com/
关于 肯定|否定预查(零宽断言)
零宽断言表示的只是匹配的位置
基本用法
- /(?=bar)/ 预查(零宽断言)右侧紧跟’bar’
- /(?!a)/ 断言位置右侧不紧跟’a’
’
- /(?<=bar)/ 断言的位置的左边紧跟’bar’
- /(?<!a)/ 断言的某个位置左边不紧跟’a’
详细说明
其实^ $ \b都是零宽断言的特殊形式
将它们化为一般形式(?=XXX)如下
^ === (?<!.) 表示在开始断言
$ === (?!.) 表示在结尾断言
\b === (?=\w)(?<!\w)|(?<=\w)(?!\w) 单词边界,表示预查每个英文单词
实践例子:密码规则匹配
规则:
密码长度为8-10
允许出现任何字符,但是其中必须含有:至少1个数字、至少1个小写字母、至少1个大写字母
表达式 :/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/
如下图,通过工具可以把表达式的关联字符及大致用意直接在工具中读出来。
这个表达式通过^.{8,10}$
限定了密码长度(匹配8至10次,尽可能多地匹配,并根据需要返回)
其中有三个正向先行断言(positive lookahead)
每个正向先行断言中都存在贪婪匹配 .*
表示匹配条件字符出现为1次或多次
再以(?=.*\d)
为例子某位置右侧含有若干数字的都会进行匹配。