经常遇到有朋友问与正则表达式有关的问题 ,网上关于常见表达式的的例子很多,但有针对性的分析较少.因此便萌发了收集常见的表达式,并加以分析的想法.(持续维护)
匹配mp3地址
http:///S+?.mp3
http:// 匹配串必须以http://开头
/S+? 不包空字符的长度不为零的字符串,这里用?表示非贪婪匹配,这样/S+?就不会匹配到后面的.mp3
.mp3 匹配串必须以.mp3结尾
匹配HTML标记
<(/S*?)[^>]*>.*?<//1>|<.*?/>
对于输入字符串<font>abc</font><font>123</font><img/>
生成三个匹配项
<font>abc</font>
------- 下一个匹配项 ----------
<font>123</font>
------- 下一个匹配项 ----------
<img/>
下面来分析它之所以能工作的原理
< 匹配串必须以字符<开头
(/S*?) 用括号括起来表示一个子表达式分组,对这个例子来说此分组的匹配结果是font,采用分组的目的是保存分组的采集结果供后面的匹配使用(马上就可以看到)
/S* /S表示与非空的字符匹配,*是限定符表示0到多次匹配,合起来/S*就表示与中间不包含非空字符的字符串匹配。
? ?跟在限定符(这个例子中是*)后边表示非贪婪匹配,只匹配符合条件的最小子串
[^>]* [^...]结构表示匹配跟在 ^ 之后的不在字符集中的任何字符。这个例子中就是除>外的任意字符,*限定符表示可以匹配0到多次这样的字符。
> 匹配>字符。到这里就完成本例中对<font>的匹配
.*? 匹配不包含换行的符的字符串,?表示只匹配符合条件的最小子串。
</ 和字符</匹配
/1 转义符/后跟分组序号表示引用此分组的匹配内容,第一个用小括号括起来的捕获匹配的序号是1,因此在这个例中/1表示分组(/S*?)的匹配结果,即font。
> 匹配字符>。
| 匹配前面或后面的表示式,此例中表示匹配<...></...>或<../>两种类型的字符串
<.*?> 匹配型如<../>的字符串。
提示:如果对贪婪匹配和非贪婪匹配不理解,可以用非贪婪表达式<.*?>和贪婪表达式(默认行为)<.*>分别匹配<img/><img/>,看匹配结果就明白了。