本文分类:
正则表达式

环视(Lookaround)用于匹配文本中的特定位置,环视本身不会匹配任意字符。有四种类型的环视,如下表所示,可以这样记忆,肯定环视的是等号,否定环视的是感叹号,顺序环视无额外字符,逆序环视在问号后面加一个小于号。

名称 英文 表达式 含义
肯定顺序环视 Positive Lookahead (?=Expr) 所在位置右侧能够匹配 Expr
肯定逆序环视 Positive Lookbehind (?<=Expr) 所在位置左侧能够匹配 Expr
否定顺序环视 Negative Lookahead (?!Expr) 所在位置右侧不能匹配 Expr
否定逆序环视 Negative Lookbehind (?<!Expr) 所在位置左侧不能匹配 Expr

下面举两个例子来理解环视。

校验密码,必须同时出现大写字母、小写字母、数字、特殊符号(#$_!),长度至少8位

^(?=.*[\d]+)(?=.*[a-z]+)(?=.*[A-Z]+)(?=.*[#$_!]+)[\w#$!]{8,}$

表达式的意思是开头位置后面应该是这样一个位置,该位置后面有数字,有小写字母,有大写字母,有特殊符号,该位置后面有至少8个指定的字符,\w等价于[0-9a-zA-Z_]。

校验密码,必须至少出现大写字母、小写字母、数字、特殊符号(#$_!)中的两种,长度至少8-20位

^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)(?![#$_!]+$)[\w#$!]{8,20}$

表达式的意思是开头位置和结尾位置之间不能全是数字,不能全是小写字母,不能全是大写字母,不能全是特殊符号,指定的字符出现8到20次,\w等价于[0-9a-zA-Z_]。

匹配模式

正则表达式的四个通配符:

通配符 含义
? 前导字符出现 0 次或 1 次,即前导字符是可选的
+ 前导字符出现 1 次或多次
* 前导字符出现 0 次或多次
{min, max} 前导字符出现 min 次到 max 次

默认情况下,这个几个特殊字符都是贪婪模式,即会根据前导字符去匹配尽可能多的内容。

在以上字符后加上一个问号则开启懒惰模式,在该模式下,正则引擎尽可能少的重复匹配字符,匹配成功之后它会继续匹配剩余的字符串。

在以上字符后加上一个加号则开启独占模式,同贪婪模式类似,独占模式也会尽可能多的匹配内容,但在独占模式下,正则表达式不会回溯,一旦匹配不成功就会结束匹配。

贪婪 懒惰 独占
X? X?? X?+
X* X*? X*+
X+ X+? X++
X{n} X{n}? X{n}+
X{n,} X{n,}? X{n,}+
X{n,m} X{n,m}? X{n,m}+

一个示例:

String s = "xxyyxxxyxxyxx";  
Pattern greedy = Pattern.compile("xx(.*)xx");  
Pattern reluctant = Pattern.compile("xx(.*?)xx");  
Pattern possessive = Pattern.compile("xx(.*+)xx");

匹配结果

xxyyxxxyxxyxx
xxyyxx
xxyxx
本文来自 [时光记 - 王智超的个人空间](www.hiwzc.com),转载请注明出处。