断言:中文意思是断然言之,十分肯定地说或做出判断。
在正则表达式中,断言可以指明在指定的内容的前面或后面会出现满足指定规则的内容。
比如"ABC DEF",正则可以用断言找出B(B前面有A的),也可以找出E(E后面有F的)。
断言是零宽度,指的是断言匹配的内容不会被保存到结果中,最终匹配的结果只是一个位置而已。
正则断言又分为下面四类:
1、(?=RE) 正向先行断言 指定位置后面能匹配RE
2、(?!RE) 负向先行断言 指定位置后面不能匹配RE
3、(?<=RE) 正向后行断言 指定位置前面能匹配RE
4、(?<!RE) 负向后行断言 指定位置前面不能匹配RE
正则断言术语解释:
正向:肯定,存在,匹配
负向:否定,不存在,不匹配
先行:从左向后为先行
后行:从向向左为后行
正则断言记忆小窍门:
正则断言术语记起来比较烧脑细胞,时间长了也会容易忘记,我们可以这样简化理解,正则断言就是对某个位置的判断,这个位置前面有什么和没有什么,这个位置后面有什么和没有什么。 有是 = ,没有是 ! ,默认是向后面,带 < 是向前面,正好 < 的箭头也是向前指的。
我就是这样记住了,这样记忆起来省事多了,学霸可以直接忽视。
1、(?=RE) 正向先行断言 指定位置后面能匹配RE
在正则表达式中,(?=RE)
称为正向先行断言(positive lookahead)。
它用于在匹配过程中,查找满足某个条件的字符串,但不消耗匹配项。
正向先行断言,通俗理解就是匹配位置,在这个位置后面怎么样,满足给定的子表达式RE条件即可。
比如 do(?=ing),表示 do 后面这个位置要有字符 ing,注意这个 ing 只是条件,并不算在匹配结果。
再如字符串:"I come from class 10 and I am 19 years old now",这里面有2个数字:10 和 19,10是班级,19是年龄。
我们想得到年龄,现在如果用 '\d+' 去匹配的话,只能匹配到班级 10。
现在如果用 '\d+(?= years)‘ 去匹配的话,加上了条件,限定数字位置后面得有 ' years' 字符,这样加上条件后就能匹配到正确的年龄数字19 。
2、(?!RE) 负向先行断言 指定位置后面不能匹配RE
在正则表达式中,(?!RE)
称为负向先行断言(negative lookahead)。
它用于在匹配过程中查找不满足某个条件的字符串,不消耗匹配项。
负向先行断言,通俗理解就是匹配位置,在这个位置后面不怎么样,不满足给定的子表达式RE条件即可。
如要获取美元的数量,我们让两们数字位置后面不匹配字符 ‘元’,这样能排除其它项,就可能美元的数量了。
3、(?<=RE) 正向后行断言 指定位置前面能匹配RE
在正则表达式中,(?<=RE)
称为正向后行断言(positive lookbehind)。
它用于在匹配过程中查找满足某个条件的字符串之前的内容,并且不消耗匹配项。
正向后行断言,通俗理解就是匹配位置,在这个位置前面怎么样,满足给定的子表达式RE条件即可。
示例:想得到李四后面的数字,我们在数字位置前面加上限定条件 (?<=李四) 即可。
4、(?<!RE) 负向后行断言 指定位置前面不能匹配RE
在正则表达式中, (?<!RE)
称为负向后行断言(negative lookbehind)。
它用于在匹配过程中查找不满足某个条件的字符串之前的内容,并且不消耗匹配项。
负向后行断言,通俗理解就是匹配位置,在这个位置前面不怎么样,不满足给定的子表达式RE条件即可。
示例:想获取李四后面的数字,都是三位数字,用排除法,我们让三位数字前面不是 “张三” 或者不是 “王五” 即可。