附录B 正则表达式参考
本书对正则表达式做了简要介绍,除详细介绍了PHP中处理正则表达式的函数之外,对正则表达式本身也做了简明阐述,包括各种字符、字符匹配、匹配模式、匹配方法。同时对几类常见的正则表达式做了较为深入的分析,以便读者通过实例理解正则表达式的原理。这里再对正则表达式的重要知识点做一些总结性的介绍。
B.1 普通字符
字母、数字、汉字、下划线,以及没有特殊定义的标点符号,都是“普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。例如表达式c在匹配字符串abcde时,匹配结果是成功,匹配到的内容是c。
B.2 元字符
正则表达式中的元字符是指定义了特殊含义的字符,元字符如表B-1所示。
表B-1 正则表达式的元字符
例如,正则表达式^abc匹配abc000xyz,但不匹配000abc000,因为字符^要求与字符串开始的地方匹配。又如,正则表达式xyz$匹配abc000xyz,但不匹配xyzabc,因为字符$要求与字符串结束的地方匹配。
B.3 转义字符
建立正则表达式时,一些不便书写的字符,在其前加“\”来表示,如表B-2所示。
表B-2 转义字符
另外一种转义是对于元字符的转义。比如,要匹配$,就要使用\$;要匹配^,就要使用\^;同理,\.匹配句点本身。举一个简单的例子,表达式\$d在匹配字符串abc$de时,可以匹配成功,其匹配到的内容是$d。
B.4 匹配多种字符的表达式
正则表达式中的一些表示方法,可以匹配“多种字符”中的任意一个字符。比如,表达式\d可以匹配任意一个数字。虽然可以匹配其中任意的字符,但是只能匹配一个,不能匹配多个。这样的表达式有很多,如表B-3所示。
表B-3 匹配多种字符的表达式
例如,正则表达式\d\d可以匹配ab10c,匹配的内容是10。又如,表达式a\d可以匹配cba2008,匹配的内容是a2。
B.5 使用符号创建匹配多种字符的表达式
使用方括号[]包含一系列字符,能够匹配其中任意一个字符。用[^]包含一系列字符,则能够匹配其中^之后所列字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意的字符,但是也只能匹配一个,不是多个。
例如,正则表达式[a@5]可以匹配字符a,或者匹配字符@,或者匹配字符5,而正则表达式[^a@5]则匹配除a、@和5之外的任意一个字符。再比如,[a-p]匹配小写字母a到小写字母p之间的任意一个字符。
B.6 用来限定匹配次数的表达式
这里的限定匹配次数,其实为满足多次匹配而设置的。因为,无论是只能匹配一种字符的表达式,还是可以匹配多种字符中任意一个的表达式,都只能匹配一次。如果使用表达式再加上限定匹配次数的特殊表达式,那么不用重复书写表达式,也可以完成重复匹配。这种用法的规则是“次数限定”放在“被限定的表达式”的后边,例如[cbd][cbd]可以写成[cbd]{2}。这种用法的具体说明如表B-4所示。
表B-4 限定匹配次数的表达式
B.7 其他说明
如果要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,可以在表达式的首尾分别使用^和$,比如正则表达式^\d+$要求整个字符串只有数字。
表达式不要匹配空字符串,否则会一直匹配成功,而结果什么都没有匹配到。
使用|匹配时,其左右两边对某个字符最好只有一边可以匹配,这样,不会让|两边的表达式因为交换位置而有所不同。