需求
在使用正则表达式做白名单的过程中,碰到下面的需求
匹配http://www.example.com 底下所有除了http://www.example.com/user/开头的所有的url
比如
这时候就需要用到正则表达式的断言。 断言是在遍历字符串进行正则匹配的过程中,会在当前字符串先进行断言正则的匹配,然后根据匹配结果再决定是否继续正则表达式的匹配
断言
断言Assertion
分为4种类型
- Look Ahead Positive Assertion
- Look Ahead Negative Assertion
- Look Behind Positive Assertion
- Look Behind Negative Assertion
前向断言Look Ahead
指的是断言正则拿当前位置之后的字符串进行比较,后向断言Look Behind
拿当前位置之前的字符串进行比较。Positive
指的是如果断言匹配成功, 则继续匹配过程, Negative
则相反, 如果断言匹配成功,则中断匹配。
这4种断言,以下面字符串开始为标记
- Look Ahead Positive Assertion:
?=
- Look Ahead Negative Assertion:
?!
- Look Behind Positive Assertion:
?<=
- Look Behind Negative Assertion:
?<!
一般会放在把断言放在一个括号中, 比如grey(?=hound)
, 断言(?=hound)
, 正则表达式是grey
,但由于断言的存在只有grey
后面跟着hound
才会匹配
例子
对上面的需求,我们可以写成如下简单的正则进行匹配
http://www.example.com/(?!=user/).*
真正的正则表达式是http://www.example.com/.*
, 但当遍历到 http://www.example.com/ 的时候,它会拿下面的字符串先进行断言匹配,如果成功则不继续。 http://www.example.com/user/user.html 虽然符合正则表达式,但在遍历到 http://www.example.com/ 的时候, 它的断言正则匹配重构,则整个匹配中断,匹配返回false