白驹过隙,这篇文章距今已有一年以上的历史。技术发展日新月异,文中的观点或代码很可能过时或失效,请自行甄别:)

简介

一种描述字符串结构的语法规则,是一个特殊的格式化模式.是一种进行文字匹配的工具.

运用

最广泛的地方就是对表单提交的数据进行判断,判断提交的数据是否符合要求(用户名,邮箱,电话号码等),还可以将其应用到数据的查询模块中,查询数据中是否有相匹配的字符.

优点

提高工作效率,节省代码量

缺点

正则匹配比较复杂时较大代码复杂度(用注释来解决)

使用

行定位符: ^,$

  1. ^表示行的开始
  2. $表示行的结束

单词界定符: \b,\B

  1. \b表示要查找的字符串为一个完整的单词.(如\btm\b只能匹配"tm")
  2. \B表示要查找的字符串不能是一个完整的单词,而是其它单词或字符串的一部分.(如\Btm\B匹配"atm","ctmd")

字符类: []

注:一个方括号只能匹配一个字符

选择字符: |

多个选择,如果"或者",如(A|a)匹配a或者A

连字符: -

用来表示字符的范围.如[a-zA-Z]匹配26个字母(大小写)

排除字符: ^

用来匹配不服和命名规则的变量,如1匹配不是字母的变量名

限定符: ?, *, +, {a,b}

  1. ?:匹配前面的字符0次或者1次
  2. +:匹配前面的字符1次或者多次
  3. *:匹配前面的字符0次或者多次
  4. {a}:匹配前面的字符a次
  5. {a,}:匹配前面的字符至少a次
  6. {a,b}:匹配前面的字符a到b次

点号字符: .

匹配除换行符外的任意一个字符.如'^p.g$'匹配字符"pig","pag".

转义字符: \

将特速字符(如'.','?','\'等)变为普通的字符.

反斜线: \

除了可以用作转义字符外还有以下作用:

将一些不可打印的字符显示出来

  1. \a:警报,即ASCII的字符(0x07)
  2. \b:退格,即ASCII的字符(0x08).注(只有中括号中使用才表示退格)
  3. \e:Escape,即ASCII的字符(0x1B)
  4. \f:换页符,即ASCII的字符(0x0C)
  5. \n:换行符,即ASCII的字符(0x0A)
  6. \r:回车符,即ASCII的字符(0x0D)
  7. \xhh:十六进制符号
  8. \cx:即"control-x"缩写,匹配由x指明的控制字符,其中x是任意字符

指定预定义字符集

  1. \d:任意一个十进制数字,相当于[0-9]
  2. \D:任意一个非十进制数字
  3. \s:任意一个空白字符(空格,换行,换页,回车,水平制表),相当于[\f\n\r\t]
  4. \S:任意一个非空白字符
  5. \w:任意一个单词字符,相当于[a-zA-Z0-9]
  6. \W:任意一个非单词字符

定义断言:

  1. \b:单词分界符,用来匹配字符串中的某些位置,\b是以统一的分界符来分配
  2. \B:非单词分界符序列
  3. \A:总是能够匹配带搜索文本的起始位置
  4. \Z:表示在未指定任何模式下匹配的字符,通常是字符串的末尾位置,或者是在字符串末尾的换行符之前的位置
  5. \z:制皮陪字符串的末尾,而不考虑任何换行符
  6. \G:当前匹配的起始位置

括号字符: ()

()将其中的正则表达式变为原子使用,将其中的正则表达式看作一个整体,叫做模式单元.其使用方法与数学表达式中的括号相似.

作用:

  1. 改变限定符的范围,如"|","*","^"等.如(thir|four)th
  2. 分组,即子表达式.如(.[0-9]{1,3}){3},相当于(.[0-9]{1.3})进行重复操作

反向引用:这个有点难,给他几个星

定义:指依靠子表达式的"记忆"功能来匹配连续出现的字符串或者字母.如果说要匹配"itit",那么可以将单词"it"分组,然后在后面家上"\1"即可,即"(it)\1".如果要匹配的字符串不固定,则将括号内的字符串写成一个正则表达式,如要匹配"abc loves abc",则可以这样'/^(.{3})[\s]loves[\s]\1$/i'.这里的"\1"就是引用第一个括号内的字符串,如果要匹配多个分组(即多个括号内的字符串),则用"\1","\2"等来表示每个分组(顺序从左到右).

除了使用数字来表示分组外还可以自己指定分组名称.格式为(?P...),反向引用该组的格式为(?P=yourname).重写刚才的例子'/^(?P.{3})[\s]loves\s$/i'.

同时反向引用还可以在正则表达式外面调用,默认使用$0,$1存储分组,顺序也是从左到右.

捕获:

在使用反向引用的时候,捕获功能就已经启用.即吧不同的分组自动保存在元字符"\1","\2"钟,使用时直接调用即可.如果不使用捕获功能可以使用仅有分组功能的非捕获符号(?:...).以表达式([a-z])([A-Z])\1\2为例,使用非捕获符号则为:(?:(?:[a-z])(?:[A-Z])){2}

欲搜索-条件子模式

再进行模式匹配时,一个字符的左侧称为左间隙,右侧称为右间隙.预搜索为匹配结果两侧附加匹配条件,但该附件条件不作为匹配结果的内容.预搜索通过一个括号"()"括起来的子模式指定条件,故称之为条件子模式.

预搜索包含正向预搜索和反向预搜索.

  1. 正向预搜索:(?=RegEx) 否定:(?!RegEx)
  2. 反向预搜索:(?<=RegEx) 否定(?<!RegEx)

举例:正向预搜索:

字符串:"this is a register book".

表达式1:"\s(?=is)"

表达式解析:

此表达式想匹配的是一个空格,并且这个空格的右边是字符串"is".在上面的字符串中应该是this后面的那个空格了:-)

匹配结果:

2014-06-09 18:44:03的屏幕截图.png

表达式2:"(?=is)ister"

表达式解析:

此表达式想匹配的是"ister",而匹配方式则是"先找到字符串"is",然后在这个位置(字符"i")开始匹配"ister",因此最后皮撇的结果是"register"中的"ister"部分

匹配结果:

2014-06-09 18:45:22的屏幕截图.png

表达式3:"(?<=is)\sis"

表达式解析:

此表达式想匹配的是从右边开始便利,找到字符串"is",然后再匹配它的右边是否有符合"\sis"这个条件的字符串,故次表达式最后匹配的姬国是this is的"is"单词.

匹配结果:

2014-06-09 18:46:50的屏幕截图.png

表达式4:"regis(?<=is)"

表达式解析:此表达式是从右往左开始找,先找到"is",然后在看下左右有没有"regis"这个字符串,注意因为预搜索是消耗字符的,所以是从is的"s"处开始向左匹配.

匹配结果:

2014-06-09 18:48:01的屏幕截图.png

模式修饰符

修饰符:i

表达式写法:(?i)...(?-i),(?i:...)

说明:忽略大小写模式

修饰符:m

表达式写法:(?m)...(?-m),(?m:...)

说明:多文本模式.即字符串内部有多个换行符时,印象"^"和"$"的匹配

修饰符:s

表达式写法:(?s)...(?-s),(?s:...)

说明:

单文本模式.在此模式下,原字符点号(.)可以匹配换行符,其它模式则不能.

注:模式修饰符既可以写在正则表达式的外面,也可咦卸载表达式内.如忽略大小写模式,可以写"/tm/i","(?i)tm(?-i)"和"(?i:tm)"三种写法.

模式匹配的顺序:

顺序原字符说明
1()模式单元
2?*+{}重复匹配
3^$\b\B\A\Z边界限制
4\ 模式选择

php中preg函数:

preg_grep函数

原型:array preg_grep(stirng pattern,array input)

说明:使用数组input中的元素一一匹配表达式pattern,最后返回由所有相匹配的元素所组成的数组.

preg_match函数

原型:int preg_match(string pattern,string subject,[array subpatterns],[int flags])

说明:对正则表达式进行匹配,该函数返回匹配的次数,0次(没有匹配)或者1次.

pattern->必要参数,指定匹配的正则表达式

subject->必要参数,指定要搜索的字符串

subpatterns->可选参数,如果提供了subpatterns,则会被搜索的结果所填充.$subpatterns[0]将包含与整个模式匹配的文本,$subpatterns[1]将包含与第一个捕获的括号中的子模式相匹配的文本,与此类推.

flags->可选参数,如果设定标记为PREG_OFFSET_CAPTURE,则每个出现的匹配结果也同时返回其附属的字符串偏移量.注意这改变了返回数组的值,是其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其偏移量.

preg_match_all函数

说明:同preg_match.只是preg_match在第一次匹配后将停止搜索,而preg_match_all则会一直搜索到subject结尾处.

preg_quote函数

原型:string preg_quote(string str[,string delimiter])

说明:将字符串str中的所有特殊字符进行自动转义.如果有参数lelimiter,那么改参数所包含的字符串也将被转义.函数返回转义后的字符串.

preg_replace函数

原型:mixed preg_replace(mixed pattern,mixed replacement,mixed subject[,int limit])

说明:在字符串subject钟匹配表达式pattern,并将匹配项替换成字符串replacement.如果有参数,则替换成limit次.

preg_replace_callback

原型:mixed preg_replace_callback(mixed pattern,callback callback,mixed subject[,int limit])

说明:与preg_replace函数相同,只是preg_replace_callback使用一个回调函数来代替replacement参数.

preg_split函数

原型:array preg_split(string pattern,string subject[,int limit])

说明:使用表达式pattern来分割字符串subject如果有参数limit,那么数组最多有limit元素.


  1. a-zA-Z