正向预查:
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
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
注意:所有的预查都是非获取匹配,不消耗字符。也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
转载:http://3721myth.blog.163.com/blog/static/31831706201132111234121/