您的位置:首页 > 编程语言 > PHP开发

自学php-正则表达式

2015-11-10 13:29 411 查看
正则表达式:用来描述字符串结构的语法规则,是一个特定的格式化模式,可以匹配、替换、截取匹配的字串;php支持POSIX和PCRE两种格式的正则表达式;

正则表达式中的术语:

grep:最初是ED编辑器中的一条命令,用来显示文件中特定的内容,后来成为一个独立的工具grep;

egrep:grep的扩展,大大增强了正则表达式的能力;

POSIX:可移植操作系统接口,是一系列标准,确保了操作系统之间的可移植性,并不是最终的标准只是一个参考;

Perl:实际抽取与汇报语言,POSIX之后的另一个标准;

PCRE:兼容Perl正则表达式的一套正则引擎,开发人员可以将其整合到php以及其他语言中,为用户提供丰富的正则功能;

正则表达式语法规则:有两部分构成:元字符和文本字符;元字符就是具有特殊含义的字符,如:”*“、”?“;文本字符就是普通的文本,如:字母和数字;PCRE风格的正则表达式一般都放置在定界符”/“中间;如:”/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/“;为了方便阅读,以下的正则表达式将省略定界符”/“:

行定位符:(^和$):用来描述子串的边界;^表示行的开始;$表示行的结尾;如:

^tm:该表达式表示要匹配字串tm的开始位置是行头,如:tm equal Tomorrow Moon可以匹配,而Tomorrow Moon equal tm则不行;但是如果使用:

tm$则可以匹配后者而不可以匹配前者;如果要匹配任意位置的字串,就直接使用  tm;

单词定界符(\b、\B):上面的例子可以看出tm可以将类似html、utmost中的tm查找出来,但如果需要匹配的是单词tm而不是单词的一部分,就需要使用分界符\b,表示查找完整的单词;如:\btm\b

大写的\B意思和\b相反,不匹配完整的单词而是匹配单词或字串的一部分;

字符类([]):正则表达式是区分大小写的,如果不区分就需要使用"[]",但是一个[]只能匹配一个字符;例如:要匹配tm不区分大小写就需要这样写:[Tt][Mm];   POSIX和PCRE都使用了一些预定义字符类,但表达方法略有不同;如:部分POSIX风格的预定义字符类:

[:digit:]:十进制数字集合,等同于[0-9];

[[:alnum:]]:字母和数字集合,等同于[a-zA-Z0-9];

[[:alpha:]]:字母集合,等同于[z-zA-Z];

...

PCRE风格的预定义字符类使用反斜线表示;

选择字符(|):实现如上例的匹配,该字符可以理解为‘或’,如:上例也可以写成:(T|t)(M|m);该表达式的意思是以字母T或t开头,后面接一个字母M或m;区别于[]:使用 [] 只能匹配单个字符,而 | 可以匹配任意长度的字串;上例还可以写成:TM|tm

|Tm|tM;

连字符(-):可以表示字符的范围:如:[a-zA-Z]

排除字符([^]):上面的 - 是匹配符合命名规范的变量,^ 匹配的就是不符合命名规范的变量;如:[^a-zA-Z];

限定符(?*+{n,m}):对于重复出现的字母或字串,可以使用限定符匹配;主要有以下六种:

?:匹配前面的字符0次或1次;如:colou?r,该表达式可以匹配colour和color;

+ :匹配前面的字符1次或多次;如:go+gle,该表达式可以匹配的范围从gogle到goo...gle;

*   :匹配前面的字符0次或多次;如:go*gle,该表达式可以匹配的范围从ggle到goo...gle;

{n} :匹配前面的字符n次;如:go{2}gle,该表达式只匹配google;

{n,}:匹配前面的字符最少n次;如:go{2,}gle,该表达式可以匹配的范围从google到goo...gle;

{n,m}:匹配前面的字符最少n次,最多m次;如:employe{0,2},该表达式可以匹配employ、employe和employee,3种情况;

点号字符(.):可以匹配除了换行符外的、任意的、一个字符;如:匹配以s开头、t结尾、中间包含一个字母的单词;格式为:

^s.t$;  匹配的字符包括sat、set、sit等;

转义字符(\):和php中的转义字符类似,为了将特殊的字符变为普通字符;例如:[0-9]{1,3}(\.[0-9]{1,3}){3}; 说明:括号在正则表达式中也算是一个元字符;

反斜线”\“:除了做转义字符外,反斜线还有其他功能:

可以将一些不可打印字符显示出来;如:\a  警报,即ASCII中的<BEL>字符(0x07);.....具体参考手册;

还可以指定预定义字符集;如:\d 任意一个十进制数字,相当于[0-9];\D 任意一个非十进制数字;....参考手册

还有一种就是定义断言;如:\b 单词分界符,用来匹配字符串中的某些位置,\b是以统一的分界符来匹配;.....参考手册

括号字符(()):

第一个作用:可以改变限定符的作用范围;如:”|“、"*"、”^“等,例子如:(thir|four)th;这个表达式的意思是匹配单词thirth或fourth,如果不使用括号就变成了匹配单词thir和fourth;

第二个作用:分组;也就是子表达式;如(\.[0-9]{1,3}){3}就是对(\.[0-9]{1,3})进行重复操作;与分组有关的还有反向引用、捕获、断言等;

反向引用:就是依靠子表达式的记忆功能来匹配连续出现的字串或字母;如:匹配连续两个it首先将单词it作为分组,然后在后面加上”\1“即可;格式为:(it)\1 ;如果要匹配的字串不固定,那么就将括号内的字串写成一个表达式,如果使用了多个分组就可以使用”\1“、"\2"来表示每个分组(顺序是从左到右);如:([a-z])([A-Z])\1\2 ,除了可以使用数字来表示分组外还可以自定义;

捕获:在使用反向引用时捕获功能就已经开启,就是将不同的分组自动保存到元字符”\1“,"\2"中,使用时直接调用即可;捕获功能很方便但是耗内存,减慢执行速度,如果不想使用捕获功能,可以使用仅有分组功能的非捕获括号(?:...);以表达式([a-z])([A-Z])\1\2
为例,使用非捕获括号格式如下:(?:(?:[a-z])(?:[A-Z])){2}

断言:(环视):也是用来匹配表达式的一种语法,但是不会占有匹配的字串,而是对当前匹配字串的位置进行匹配(真正匹配的是字串的位置);环视分为顺序环视和逆序环视:

顺序环视:从左到右查看字符串,匹配字串最左边的位置;语法如下:(?=···)如:\s(?=is)和(?=is)ister,\s代表空白字符;在”This is a register book.“这句话中,两个表达式匹配的分别是:This is中间的空格和register的ister部分;即一个匹配的是空格,一个是字串ister;

逆序环视:从右到左查看字符,匹配字串最右边的位置;语法为:(?<=···)仍以上例来说明,这两个逆序环视表达式(?<=is)\sis和regis(?<=is)的匹配结果为:\sis和regis

模式修饰符:[/b]作用是模式设置,也就是规定正则表达式应该如何解释和应用;php中的主要模式为:

i:表达式写法(?i)···(?-i)、(?i:···);忽略大小写模式;

M:(?m)···(?-m)、(?m:···);多文本模式;即字串内部有多个换行符时,影响”^“和”$“的匹配;

s:(?s)···(?-s)、(?s:···);单文本模式;此模式下,元字符点号(.)可以匹配换行符,其他模式不能匹配换行符;

X:(?x)···(?-x)、(?x:···);忽略空白字符;

模式修饰符既可以写在正则表达式内也可写在外面;如忽略大小写模式,可以写为:/tm/i、(?i)tm(?-i)、(?i:tm)3种格式;

正则表达式的学习与应用较难理解,慢慢学习;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: