1 基础知识
正则表达式是一种描述一段文本模式的方法。到目前为止,我们前面所用到过的精确(文字)匹配也是一种正则表达式。例如,前面我们曾搜索过正则表达式的术语,像"shop"和"delivery"。
在PHP中,匹配正则表达式更有点像strstr()匹配,而不像相等比较,因为是在一个字符串的某个位置(如果不指明则可能在字符串中的任何位置)匹配另一个字符串。例如,字符串"shop"匹配正则表达式"shop"。它也可以匹配正则表达式"h"、"ho",等。
除了精确匹配字符外,还可以用特殊字符来指定表达式的元意(meta-meaning)。例如,使用特殊字 符,可以指定一个在字符串开始或末尾肯定存在的模式,该模式的某部分可能被重复,或模式中的字符属于特定的某一类型。此外,还可以按特殊字符的出现来匹 配。接下来,我们将逐个讨论这些变化。
2 字符集和类
使用字符集可以马上给出比精确匹配功能还要强大的正则表达式。字符集可以用于匹配属于特定类型的任何字符;事实上它们是一种通配符。
首先,可以用字符作为一个通配符来代替除换行符(n)之外的任一个字符。例如,正则表达式:
.at
可以与"cat"、"sat"和"mat"等进行匹配。通常,这种通配符匹配用于操作系统中的文件名匹配。
但是,使用正则表达式,可以更具体地指明希望匹配的字符类型,而且可以指明字符所属的一个集合。在前面的例子中,正则表达式匹配"cat"和"mat",但也可以匹配"#at"。如果要限定它是a到z之间的字符,就可以像下面这样指明:
[a-z]at
任何包含在方括号([])中的内容都是一个字符类——一个被匹配字符所属的字符集合。请注意,方括号中的表达式只匹配一个字符。
我们可以列出一个集合,例如:
[aeiou]
可以用来表示元音子母。
也可以描述一个范围,正如前面用连字符那样,也可以是一个范围集:
[a-zA-Z]
这个范围集代表任何的大小写字母。
此外,还可以用集合来指明字符不属于某个集。例如:
[^a-z]
可以用来匹配任何不在a和z之间的字符。当把脱字符号(^)包括在方括号里面时,表示否。当该符号用在方括号的外面,则表示另外一个意思,我们稍后将详细介绍。
3 重复
通常,读者会希望指明某个字符串或字符类将不止一次地出现。可以在正则表达式中使用两个特殊字符代替。符号“*”表示这个模式可以被重复0次或