自学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种格式;
正则表达式的学习与应用较难理解,慢慢学习;
正则表达式中的术语:
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种格式;
正则表达式的学习与应用较难理解,慢慢学习;
相关文章推荐
- PHP编码规范
- php爬虫学习笔记1 PHP Simple HTML DOM Parser
- 在PHP中使用FastCGI解析漏洞及修复方案
- 考虑 PHP 5.0~5.6 各版本兼容性的 cURL 文件上传
- Yii2 数据操作Query Builder
- 深入PHP内核之in_array
- Elasticsearch-PHP 命名空间
- FTPClient中的enterLocalPassiveMode();方法
- PHP - xhprof+Graphviz 安装配置
- PHPExcel判断与转换Excel中的日期
- FTP上传经常中断处理方法
- 从零开始机器学习实战2-Matplotlib绘图
- Php创建验证码类
- php中关于 left join 的分页显示
- php curl常见错误:SSL错误、bool(false)
- php实现图片base64加密和解密
- ThinkPHP 实现将SESSION存 mysql db方式session
- ThinkPHP 分页
- 自学php-字符串操作2
- ThinkPHP快速入门5_循环和控制输出,公共模板和模板布局