一、入门:正则字符
关于正则字符,很多文章都会讲到,足足有一篇文章才能描述清楚,我这里就不多说,对于我,平时,常用的有:
1. .
匹配不包括换行的任意字符
在php的s修饰符下面可以匹配换行,如$pattern='#<div>(.*?)</div>#s';
就可以匹配div内容有换行的数据。
2. \s
空格、tab、换行
[\s\S]表示匹配任意字符,\S是\s的反义。
注意区分[\s\S]与.的区别。
3. *
匹配零个或更多个,即0~n
4. +
匹配一个或更多个,即至少一个,1~n
5. \
转义
一个特殊字符前加\
就表示转义,说明把它当普通字符用
6. []
单字符取一个,比如[abc]会匹配a或b或c
但是,如果[]
里面加上^
则会变成排除这个字符,如[^abc]
就表示不是a、不是b、也不是c
另外,在[]
里面可以使用-
表示一个范围,如[0-9]
表示从0到9,类似的还有[a-zA-Z]
,如果要包含-
字符,可以给它加上转义[\-]
。
关于[]
常见的错误用法是:[ab|bc]
用来表示ab
或bc
,实际上,它得到的结果是[abc|]
,即a或b或c或|
这4个字符(单字符)的任意一个。这里可以改成(ab|bc)
。
总结:[]里面的特殊符有五个:[]-\^
,其他字符都是普通字符,包括*.?
等。
说明:
* ^
在[^
的首位时候才有特殊意义
* [0-9
-
在不是首尾的时候有特殊意义
* \[ \]
因为占用[]
本身字符,所以有特殊意义
* \
本身是转义符,有特殊意义
7. ^
字符串开始
这里的^跟[]
里面用的^
是同一个字符,但是却不是一个意思,这里它表示整个字符串的开始,比如^www
表示以www
开头的字符串,注意区分,不在[]
里面的是开始符,在里面的排除
8. $
字符串结束
9. {1,3}
循环次数
[0-9]{1,3}
表示在0-9的范围里面循环1个、2个或者3个,可能结果有5、20、415等。
如果循环指定次数,如3次,则{3,3}
可以简写成{3}
。
如果刚好需要匹配字符{1}
,则正则需要给{
进行转义,得到\{1}
的正则。
如果{}
中间不是数字,则{}
本身不需要转义。
10. ?
有两个用法
(1) 匹配一个或零个
比如https?
匹配的https
(一个s)或者http(零个s)
(2)非贪婪模式
所谓非贪婪模式,就是匹配尽可能少的内容,比如,对于源字符串
<div>a</div><div>b</div>
使用<div>(.*?)</div>
会得到2个结果(注意:如果源字符串有换行,使用[\s\S]替换 . ):
<div>a</div>
和
<div>b</div>
因为,当遇到第一个</div>
,非贪婪模式就不会再往后找了。
而使用<div>(.*)</div>
(贪婪模式)则会得到整个字符串
<div>a</div><div>b</div>
,因为它会匹配所有字符直到后面再找不到</div>
。
更多关于?
的使用,可以参考《正则表达式匹配次数》