正则表达式断言

需求

在使用正则表达式做白名单的过程中,碰到下面的需求

匹配http://www.example.com 底下所有除了http://www.example.com/user/开头的所有的url
比如

  1. http://www.example.com/photos/detail.html匹配
  2. http://www.example.com/user/user.html不匹配

这时候就需要用到正则表达式的断言。 断言是在遍历字符串进行正则匹配的过程中,会在当前字符串先进行断言正则的匹配,然后根据匹配结果再决定是否继续正则表达式的匹配

断言

断言Assertion分为4种类型

  1. Look Ahead Positive Assertion
  1. Look Ahead Negative Assertion
  2. Look Behind Positive Assertion
  3. Look Behind Negative Assertion

前向断言Look Ahead指的是断言正则拿当前位置之后的字符串进行比较,后向断言Look Behind拿当前位置之前的字符串进行比较。Positive指的是如果断言匹配成功, 则继续匹配过程, Negative则相反, 如果断言匹配成功,则中断匹配。
这4种断言,以下面字符串开始为标记

  1. Look Ahead Positive Assertion: ?=
  1. Look Ahead Negative Assertion: ?!
  2. Look Behind Positive Assertion: ?<=
  3. 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

参考

  1. https://docs.racket-lang.org/guide/Looking_Ahead_and_Behind.html
  2. http://help.qualaroo.com/hc/en-us/articles/201541217-Excluding-URLs-Focusing-on-specific-URLs-Negative-and-Positive-Lookaheads

你可能感兴趣的:(正则表达式断言)