正则表达式之环视(Look Around)
环视只进行子表达式的匹配,匹配内容不计入最终的匹配结果。
环视按照方向划分有顺序和逆序两种,按照是否匹配有肯定和否定两种,组合起来就有四种环视。环视相当于对所在位置加了一个附加条件。
- (?<=Expression) 逆序肯定环视,表示所在位置左侧能够匹配Expression
- (?<!Expression) 逆序否定环视,表示所在位置左侧不能匹配Expression
- (?=Expression) 顺序肯定环视,表示所在位置右侧能够匹配Expression
- (?!Expression) 顺序否定环视,表示所在位置右侧不能匹配Expression
例如:“(?<=abc )\d+”在匹配“abc 123”时,匹配结果为“123”。“\d+”表示匹配一个以上的数字,而“(?<=abc )”相当于一个附加条件,表示所在位置左侧必须为“abc ”,它所匹配的内容并不计入匹配结果。同样的正则在匹配“acc 123”时,匹配失败,因为这里任意一串数字子串的左侧都不是“abc ”。
这里说一下个人遇到的问题:需匹配以指定规则开头、不以指定规则结尾的字符串。如匹配以数字开头不以’abc’结尾的字符串:正则为^[0-9]+.*(?<!abc)$。
另一个使用最多的正则就是校验密码:必须要包含数字和大小写字母的6-16位密码,使用环视就很简单。^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{6,16}$
- ^开始标记
- (?=.*\\d) 保证字符串包含一个数字
- (?=.*[a-z]) 保证字符串一个小写字母
- (?=.*[A-Z]) 保证字符串包含一个大写字母
- [0-9a-zA-Z]{6,16} 保证字符串长度为6-16
- $结束标记
转自 http://www.zhouhaocheng.cn/2015/181.html