10.2 正则表达式基础语法
正则表达式由一些普通字符和一些元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,如“*”、“?”等。PCRE风格的正则表达式一般都放置在定界符“/”中间,如“/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/”。
10.2.1 元字符
元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
要想真正用好正则表达式,正确地理解元字符是最重要的事情。表10-1列出了常用的元字符和其简单描述。
元字符 | 描述 | 举例 |
. | 匹配任何单个字符 | 如c.ke,匹配cake,但是不匹配cook |
^ | 匹配一行开始的空字符串 | 如^where,匹配where in…,但是不匹配when… |
$ | 匹配出现在行尾的空字符串 | 如$way,匹配… on the way,但是不匹配…on the WAY |
* | 匹配前面的子表达式零次或多次 | 如ta*k,匹配tk,tak,taak到ta…k |
+ | 匹配前面的子表达式一次或多次 | 如ta*k,匹配tak,taak到ta…k,但是不匹配tk |
? | 匹配前面的子表达式零次或一次 | 如ta*k,匹配tk,tak |
{n} | n是一个非负整数。匹配确定的n次 | 如ta{2}k,匹配taak |
{n,} | n是一个非负整数。至少匹配n次 | 如to{2}e,匹配tooe,toooe等 |
{n,m} | m和n均为非负整数,其中n≤m。最少匹配n次且最多匹配m次 | 如to{1,3}e,匹配toe,tooe,toooe |
\b | 匹配一个单词边界 | 如er\b,匹配never,但是不匹配verb |
\B | 匹配非单词边界 | 如er\B匹配verb,但是不匹配never |
[] | 匹配[]内的任意一个字符 | 如[abc]可以匹配a或者b或者c |
| | 选择字符,匹配|两侧的任意字符 | 如TO|to|To|tO,可以匹配4种不同字符 |
- | 连字符,匹配一个范围 | 如[a-z],可以匹配任意一个小写字母 |
[^] | 不匹配[]内的任何一个字符 | 如[^a-z],匹配非小写字母 |
\ | 转义字符 | 如需要匹配. ,?等,需要把它们变为普通字符,“\.”用于匹配“.” |
\ | 反斜杠,见表10-2和表10-3 | |
() | 分组或选择 | 如(very){1,},匹配very good、very very good;如(four|six)th,匹配fourth或sixth |
(?:pattern) | 匹配pattern但不获取匹配结果 | 如industr(?:y|ies)就是比industry|industries更简略的表达式 |
(?=pattern) | 正向预查,在任何匹配pattern的字符串开始处匹配查找字符串 | 如Windows(?=95|98|NT|2000)能匹配Windows 2000,但不能匹配Windows 3.1 |
(?!pattern) | 负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串 | 如Windows(?!95|98|NT|2000)能匹配Windows 3.1,但不能匹配Windows 2000 |
预定义字符集 | 说明 |
\d | 任意一个十进制数字,相当于[0-9] |
\D | 任意一个非十进制数字,相当于[^0-9] |
\s | 任意一个空白字符,包括Tab键和换行符 |
\S | 任意一个非空白字符 |
\w | 任意一个单词字符,相当于[a-zA-Z0-9_] |
\W | 用于匹配所有与\w不匹配的字符 |
字符 | 说明 |
\a | 警报,ASCII中的<BEL>字符 |
\e | Escape,ASCII中的<ESC>字符 |
\f | 换页符,ASCII中的<FF>字符 |
\n | 换行符,ASCII中的<LF>字符 |
\r | 回车符,ASCII中的<CR>字符 |
\t | 水平制表符,ASCII中的<HT>字符 |
\cx | “control-x”,其中x是任意字符 |
\xhh | 十六进制代码 |
\ddd | 八进制代码 |
10.2.2 模式修饰符
模式修饰符的作用是规定正则表达式该如何解释和应用。PHP的主要模式如表10-4所示。
修饰符 | 说明 |
i | 忽略大小写模式 |
m | 多行匹配。仅当表达式中出现“^”,“$”中的至少一个元字符且字符串有换行符“\n”时,“m”修饰符才起作用,不然被忽略。“m”修饰符可以改变“^”为表示每一行的头部 |
s | 改变元字符'.'的含义,使其可以代表所有字符,也包含换行符。其他模式不能匹配换行符 |
x | 忽略空白字符 |