经常有朋友在问正则问题时表示对零宽断言摸不着头脑,抑或是会用一点,但生搬硬套的多。因此一直有这个想法做一些经验谈给大家。趁心血来潮搭了个Blog就以这个开篇吧。如有错误或遗漏,欢迎大家大家指出。

那么,零宽断言是什么?

零宽断言,有的人称为 环视(我比较习惯称作环视,但是为了和大多教程统一,本文也用零宽断言称呼)在百度百科中是这么介绍的:

用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为 零宽断言。最好还是拿例子来说明吧: 断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。

**这个说法太笼统,大家可以先看看网上广为流传且备受好评的正则表达式入门教程(作者deerchao,http://deerchao.net/tutorials/regex/regex.htm)里零宽断言的介绍。

** **看完之后,是否在脑子里对零宽断言有概念了?一头雾水,完全没有概念?没关系,我们换个容易的方式来说明。

我默认看这文章的同学已经有了基本的正则基础,那么,我们先来了解下大家熟悉的元字符。

常用的元字符如\w、\s、\d等都是匹配的是字符,我们习惯上都会觉得字符匹配是去匹配字符(大家熟悉的winodws通配符最为典型)。

但是还有几种元字符比较特殊,如^、$、\b等他们匹配的是”位置”。字符串开始的位置,结束的位置,或者是单词的边界等。

那么,现在我们来说零宽断言,零宽断言匹配的其实也是位置

** **举例下如此(实例软件使用RegexBuddy)

(?=exp): 匹配当前位置后面是exp的位置

如:a(?=b),匹配一个后面是b的a

1

(?!exp): 匹配当前位置后面不是exp的位置

如:a(?=b),匹配一个后面不是b的a

2

(?<=exp):匹配当前位置前面是exp的位置

如:(?<=a)b,匹配一个前面是a的b

3

(?<!exp): 匹配当前位置前面是exp的位置

如:(?<!a)b,匹配一个前面不是a的b

4

暂定下一章:使用零宽断言的一些小技巧