正则表达式

一:语法基础

完整的正则表达式由两种字符组成 特殊字符(元字符)和普通字符(文本)
示例:
/^\d+hello.*/
\d + . * 都是元字符
hello是普通字符

二:元字符

1.元字符列表

. 除了换行以外的任意字符
[abcde] 匹配abcde里面的任意字符
[^abcde] 不匹配abcde里面的任意字符
[a-h] 匹配a-h的任意字符
\w相当于[a-zA-Z0-9_]
\W相当于[^a-zA-Z0-9_]
\s匹配任何空白字符[ \f\n\r\t\v]
\S匹配任意非空白字符[^\s]
\d匹配数字
\D不匹配数字
[\u4e00-\u9fa5]匹配任意汉字(这里用unicode编码表示汉字)

2.元字符-限定字符

*匹配0-多个字符
?匹配0-1个元字符
{0,}0-多个元素
{0,1}0-1个字符
{n}匹配n个字符
{n,}匹配至少N个字符
+至少匹配一个
\b匹配单词边界
^匹配行首
$匹配行尾

3.说明:

1)特殊字符转义:\,?,",比如至少一个\,正则表达式匹配应为\\+
2)可以将元字符或普通字符括起来作为分组

如何判定哪些是元字符?
元字符转义测试

三:进阶

1.多选结构,正则的多种写法

2.分组和后项引用

3.环视(零宽断言),

不匹配任何字符,只匹配特定的位置,类似于\b,^,$。环视不会占用字符
环视分为顺序和逆序两种
顺序(?=exp)位置的后面能匹配exp,(?!exp)位置的后面能不匹配exp
逆序(?<=exp)位置的前面能匹配的exp,例如(?<=\d)当前位置的左边是数字
(?<!exp)位置的前面不能匹配的exp,例如(?<!\d)当前位置的左边不能匹配数字

4.贪婪和非贪婪(匹配优先与忽略优先)

<?php
$string = 'aaabaab';
$pattern1 = '/a.{1,10}b/';
$pattern2 = '/a.{1,10}?b/';
preg_match_all($pattern1,$string,$arr1);
preg_match_all($pattern2,$string,$arr2);
var_dump($arr1);
var_dump($arr2);

四:高级

1.正则引擎的了解
2.回溯
3.表达式的优化
1)化简量词
2)尽量不使用分组
3)尽量不使用或a|b|c不如[abc]的效率
4)回溯的越少,速度越快

五:PHP与正则表达式

1.PHP常用的模式修饰符

1)i 大小写不敏感
2)m 增强的行锚点模式
3)x 空白和#注释将被忽略
4)s 点号元字符匹配所有字符,包含换行符
5)e 将替换后的字符串作为PHP 代码评估执行

2.PHP中的正则使用

PHP中的pcre库和posix库的对比
pcre的正则分隔符可以是任意的

posted @ 2018-04-18 15:33  芭菲雨  阅读(165)  评论(0编辑  收藏  举报