正则表达式
一:语法基础
完整的正则表达式由两种字符组成 特殊字符(元字符)和普通字符(文本)
示例:
/^\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的正则分隔符可以是任意的