1、入门简介
简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具,主要用于字符串的模式分割、匹配、查找及替换操作。我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或sedshell程序等。此外,象JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。由此可见,正则表达式已经超出了某种语言或某个系统的局限,成为人们广为接受的概念和功能。
正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。
举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确。如果通过正则表达式验证用户邮件地址的格式正确,用户所填写的表单信息将会被正常处理;反之,如果用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。由此可见正则表达式在WEB应用的逻辑判断中具有举足轻重的作用。
使用正则表达式在某些简单的环境下可能效率不高,因此如何更好的使用PHP正则表达式需要综合考虑。
2、基本语法
在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。
正则表达式的形式一般如下:
/love/
其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。
1>正则函数
php中有两套正则函数,两者功能差不多,分别为:
一套是由PCRE(Perl Compatible RegularExpression,意思是Perl兼容正则表达式)库提供的,使用“preg_”为前缀命名的函数;
一套是由POSIX(PortableOperating System Interface of Unix)扩展提供的,使用以“ereg_”为前缀命名的函数;(POSIX的正则函数库,自PHP 5.3以后,就不在推荐使用,从PHP6以后,就将被移除);
由于POSIX正则即将推出历史舞台,并且PCRE和perl的形式差不多,更利于我们在perl和php之间切换,所以这里重点介绍PCRE正则的使用。
在PCRE中,通常将模式表达式(即正则表达式)包含在两个反斜线“/”之间,如“/apple/”。
使用PERL兼容规则的函数有:
preg_grep()
preg_replace_callback()
preg_match_all()
preg_match()
preg_quote()
preg_split()
preg_replace()
函数的具体使用,我们可以通过PHP手册来找到。
2>元字符(Meta-character):
为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。
所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
较为常用的元字符包括:+
,*
,以及 ?
。
*
其前导字符必须在目标对象中出现0次、1次或连续多次;
.
用于匹配除换行符之外的所有字符1次;
?
其前导匹配对象连续出现0次或1次;
+
其前导匹配对象连续出现1次或多次;
|
选择匹配类似PHP中的|(因为这个运算符合是弱类型导致前面最为整体匹配);
^
匹配对象出现在字符串的首部;
$
匹配对象出现在字符串尾部
{m}
匹配前一个内容的重复次数为M次;
{m,}
匹配前一个内容的重复次数大于等于M次;
{m,n}
匹配前一个内容的重复次数M次到N次;
( )
合并整体匹配,并放入内存,可使用12…依次获取;
b
出现在目标字符串的开头或结尾的两个边界之一,边界可以是空格或者特殊字符;
B
对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾;
s
用于匹配单个空格符,包括tab键和换行符,等价于[ftv]
;
用于匹配除单个空格符之外的任何一个字符,
[^ftv]
;
d
匹配从0到9的一个数字,等价于[0-9]
;
D
匹配除数字以外任何一个字符,等价于[^0-9]
;
w
用于匹配一个字母、数字或下划线字符,等价于[0-9a-zA-Z_]
;
W
用于匹配所有除英文字母、数字和下划线以外任何的一个字符,[^0-9a-zA-Z_]
;
A
匹配字符串串首的原子
Z
匹配字符串串尾的原子
f
匹配一个换页符等价于 x0c 或cL
n
匹配一个换行符;等价于x0a 或cJ
r
匹配一个回车符等价于x0d 或cM
t
匹配一个制表符;等价于 x09或cl
v
匹配一个垂直制表符;等价于x0b或ck
oNN
匹配一个八进制数字
xNN
匹配一个十六进制数字
cC
匹配一个控制字符
为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:
/[A-Z]/
上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。
/[a-z]/
上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。
/[0-9]/
上述正则表达式将会与从0到9范围内任何一个数字相匹配。
/([a-z][A-Z][0-9])+/
上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。
\1
提取第一位的属性
例如/^d{2}([W])d{2}\1d{4}$/
匹配“12-31-2006”、“09/27/1996”、“8601 4321”等字符串。
但上述正则表达式不匹配“12/34-5678”的格式,这是因为模式“[W]”的结果“/”已经被存储,下个位置“1”引用时,其匹配模式也是字符“/”。
这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()”把字符串组合在一起。
“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如“abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。
如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符“|”。例如:
/to|too|2/
上述正则表达式将会与目标对象中的 “to”,“too”, 或 “2” 相匹配。
正则表达式中还有一个较为常用的运算符,即否定符“[^]”。
与我们前文所介绍的定位符 “^”不同,否定符“[^]”规定目标对象中不能存在模式中所规定的字符串。例如:
/[^A-C]/
上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。
最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义字符“”。例如:
/Th*/
上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。
当不需要存储匹配结果时使用非存储模式单元“(?:)”
例如/(?:a|b|c)(D|E|F)\1g/
将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的,否则需要改变其后引用的顺序。上例还可以写成/(a|b|c)(C|E|F)2g/
。
3>转义字符
d
包含所有数字[0-9]
D
除所有数字外[^0-9]
w
包含所有英文字符[a-zA-Z_0-9]
W
除所有英文字符外[^a-zA-Z_0-9]
s
包含空白区域如回车、换行、分页等 [fnr]
a
alarm,即BEL 字符(’0)
cx
“control-x”,其中x 是任意字符
e
escape(’0B)
f
换页符 formfeed(’0C)
n
换行符 newline(’0A)
r
回车符 carriagereturn(’0D)
t
制表符 tab(’0)
xhh
十六进制代码为 hh的字符
ddd
八进制代码为 ddd的字符,或 backreference
d
任一十进制数字
D
任一非十进制数的字符
A
目标的开头(独立于多行模式)
Z
目标的结尾或位于结尾的换行符前(独立于多行模式)
z
目标的结尾(独立于多行模式)
G
目标中的第一个匹配位置
4 模式修正符(Pattern Modifiers):
模式修正符在忽略大小写、匹配多行中使用特别多,掌握了这一个修正符,往往能解决我们遇到的很多问题。
i 匹配时忽略大小写,可同时匹配大小写字母;
m 将字符串视为多行,当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(n)的之后和之前;
s 将字符串视为单行,换行符做普通字符看待,使“.”匹配任何字符;
x 模式中的空白忽略不计
U 匹配到最近的字符串,禁止贪婪匹配,只跟踪到最近的一个匹配符并结束,常用在采集程序上的正则表达式;
U 模式字符串被当成UTF-8;
e 将替换的字符串作为表达使用,只有preg_replace() 使用此修正符,其它 PCRE 函数将忽略之;
A 如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配;
D 如果设定了此修正符,模式中的行结束($)仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面,如果设定了m 修正符则忽略此选项;
5>运算顺序
运算规则:从左→到右
优先级:
()() 圆括号因为是内存处理所以最高;
* ? + { }
重复匹配内容其次;
^ $ b
边界处理第三;
|
条件处理第四;
最后按照运算顺序计算匹配。
标签: 提示信息,表达式,编辑器,字符串,客户端