正则表达式之:正向预查和反向预查

正向预查:

1. 正向正预查:(?=)

例如:

foo(?=bar)        //匹配后面带有bar的foo

它可以匹配: foobar, abcfoobar  中的foo

但是不能匹配:fooabc 中的foo

2. 正向负预查:(?!)

例如:

foo(?!bar)        //匹配后面不带bar的foo

它可以匹配: foo123

但是不能匹配:foobar

 

负向预查

1. 负向正预查(?<=)

例如:

(?<=foo)bar        //匹配前面有foo的bar

它可以匹配: foobar, 123foobar  中的bar

不可以匹配: 123bar 中的bar

2. 负向负预查(?<!)

例如:

(?<!foo)bar        //匹配前面没有foo的bar

它可以匹配: 123bar 中的bar

不可以匹配: foobar, 123foobar  中的bar

预查还可以嵌套

例如:

(?<=(?<!foo)bar)baz        //匹配一个baz,它前面要有bar,但是bar的前面不可以是foo

它可以匹配 123barbaz   中的baz

但是不可以匹配foobarbaz

(?<=\d{3}…(?<!999))foo        //匹配一个foo,它前面是三个非999的字符,这三个字符之前是三个数字

它可以匹配123123foo, 111cdefoo, 111c2cfoo  里面的foo

但是不能匹配 123999foo,abcabcfoo 里面的foo

注意:所有的预查都是非获取匹配,不消耗字符。也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

更多关于PHP正则表达式

无觅相关文章插件

  1. No comments yet.

  1. No trackbacks yet.