环视(断言)我也没做太多了解,仅在使用中了解了(?=)
的用法,在这里记录一下。参考
概念
(?=)
为非获取匹配的一种,非获取匹配即为 匹配到后不会将结果放入Matches
集合中(?=)
特殊在于,它匹配到后不会移动匹配指针,二是再次从起始位置匹配
示例
如/(?=.*\d)(?=.*[a-z])/
,这里面有连续两个环视
- 第一个查找
.*\d
即包含前方存不存在东西都可以的任意数字 - 第二个查找
.*[a-z]
即包含前方存不存在东西都可以的任意小写字母
很容易理解,我们是想他能够实现识别一个字符串至少存在一个数字和一个小写字母的功能
如果按照正常的正则匹配,第一个匹配结束后从匹配到的地方开始,继续匹配第二个,是不符合功能需求的
因此这里用到了环视,当查找(?=.*\d)
时,从头开始查找,找到后再查找(?=.*[a-z])
时,依旧从头开始查找
实践
看这段高安全性密码验证规则:/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,20}$/
释义:在依次从头寻找是否存在数字、小写字母、大写字母后,从头开始匹配8-20个字符