简介
一种描述字符串结构的语法规则,是一个特殊的格式化模式.是一种进行文字匹配的工具.
运用
最广泛的地方就是对表单提交的数据进行判断,判断提交的数据是否符合要求(用户名,邮箱,电话号码等),还可以将其应用到数据的查询模块中,查询数据中是否有相匹配的字符.
优点
提高工作效率,节省代码量
缺点
正则匹配比较复杂时较大代码复杂度(用注释来解决)
使用
行定位符: ^,$
- ^表示行的开始
- $表示行的结束
单词界定符: \b,\B
- \b表示要查找的字符串为一个完整的单词.(如\btm\b只能匹配"tm")
- \B表示要查找的字符串不能是一个完整的单词,而是其它单词或字符串的一部分.(如\Btm\B匹配"atm","ctmd")
字符类: []
注:一个方括号只能匹配一个字符
选择字符: |
多个选择,如果"或者",如(A|a)匹配a或者A
连字符: -
用来表示字符的范围.如[a-zA-Z]匹配26个字母(大小写)
排除字符: ^
用来匹配不服和命名规则的变量,如1匹配不是字母的变量名
限定符: ?, *, +, {a,b}
- ?:匹配前面的字符0次或者1次
- +:匹配前面的字符1次或者多次
- *:匹配前面的字符0次或者多次
- {a}:匹配前面的字符a次
- {a,}:匹配前面的字符至少a次
- {a,b}:匹配前面的字符a到b次
点号字符: .
匹配除换行符外的任意一个字符.如'^p.g$'匹配字符"pig","pag".
转义字符: \
将特速字符(如'.','?','\'等)变为普通的字符.
反斜线: \
除了可以用作转义字符外还有以下作用:
将一些不可打印的字符显示出来
- \a:警报,即ASCII的
字符(0x07) - \b:退格,即ASCII的
字符(0x08).注(只有中括号中使用才表示退格) - \e:Escape,即ASCII的
字符(0x1B) - \f:换页符,即ASCII的
字符(0x0C) - \n:换行符,即ASCII的
字符(0x0A) - \r:回车符,即ASCII的
字符(0x0D) - \xhh:十六进制符号
- \cx:即"control-x"缩写,匹配由x指明的控制字符,其中x是任意字符
指定预定义字符集
- \d:任意一个十进制数字,相当于[0-9]
- \D:任意一个非十进制数字
- \s:任意一个空白字符(空格,换行,换页,回车,水平制表),相当于[\f\n\r\t]
- \S:任意一个非空白字符
- \w:任意一个单词字符,相当于[a-zA-Z0-9]
- \W:任意一个非单词字符
定义断言:
- \b:单词分界符,用来匹配字符串中的某些位置,\b是以统一的分界符来分配
- \B:非单词分界符序列
- \A:总是能够匹配带搜索文本的起始位置
- \Z:表示在未指定任何模式下匹配的字符,通常是字符串的末尾位置,或者是在字符串末尾的换行符之前的位置
- \z:制皮陪字符串的末尾,而不考虑任何换行符
- \G:当前匹配的起始位置
括号字符: ()
()将其中的正则表达式变为原子使用,将其中的正则表达式看作一个整体,叫做模式单元.其使用方法与数学表达式中的括号相似.
作用:
- 改变限定符的范围,如"|","*","^"等.如(thir|four)th
- 分组,即子表达式.如(.[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
同时反向引用还可以在正则表达式外面调用,默认使用$0,$1存储分组,顺序也是从左到右.
捕获:
在使用反向引用的时候,捕获功能就已经启用.即吧不同的分组自动保存在元字符"\1","\2"钟,使用时直接调用即可.如果不使用捕获功能可以使用仅有分组功能的非捕获符号(?:...).以表达式([a-z])([A-Z])\1\2为例,使用非捕获符号则为:(?:(?:[a-z])(?:[A-Z])){2}
欲搜索-条件子模式
再进行模式匹配时,一个字符的左侧称为左间隙,右侧称为右间隙.预搜索为匹配结果两侧附加匹配条件,但该附件条件不作为匹配结果的内容.预搜索通过一个括号"()"括起来的子模式指定条件,故称之为条件子模式.
预搜索包含正向预搜索和反向预搜索.
- 正向预搜索:(?=RegEx) 否定:(?!RegEx)
- 反向预搜索:(?<=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元素.
- a-zA-Z ↩