正则表达式,这个技能一直没有get,每次需要用的时候都是网上搜一下然后实现相应的功能,就没再研究下去。今天有机会仔细看了一篇网上的良心教程,在此记录下来其中重要的知识点。另外,给regexlab这个网站打call。http://www.regexlab.com/zh/regref.htm
普通字符匹配,举例:
表达式"c"在匹配字符串"abcde"时,匹配结果是成功,匹配到的位置是开始于2,结束于3。
表达式"bcd"在匹配字符串"abcde"时,匹配结果是成功,匹配到的内容是"bcd",匹配到的位置是开始于1,结束于4.
转义字符
\r, \n, 代表回车符和换行符
\t,代表制表符
\,代表""本身
能够与“多种字符”匹配的表达式
\d 匹配任意一个数字,0~9中任意一个
\w 任意一个字母或数字或下划线,也就是AZ,az,0~9,_中任意一个
\s 匹配空格、制表符、换页符等空白字符中的任意一个
. 可匹配除了换行符以外的任意一个字符
自定义能够匹配“多种字符”的表达式
[ab5@] 匹配a或b或5或@
[^abc] 匹配a,b,c之外的任意一个字符
[f-k] 匹配f~k之间的任意一个字母
[^A-F0-3] 匹配A~F, 0~3之外的任意一个字符
修饰匹配次数的特殊符号
{n} 表达式重复n次
{m,n} 表达式至少重复m次,最多重复n次
{m, } 表达式至少重复m次
? 表达式重复0次或1次
- 表达式至少出现一次
- 表达式不出现或者出现任意次,相当于{0,}
其它一些代表抽象意义的特殊符号
^ 与字符串开始的地方匹配,不匹配任何字符
$ 与字符串结尾的地方匹配,不匹配任何字符
\b 匹配一个单词的边界,也就是单词和空格之间的位置,不匹配任何字符
一些符号可以影响表达式内部的子表达式之间的关系
| 左右两个表达式之间“或”关系,匹配左边或者右边
() 在被修饰匹配次数的时候,括号中的表达式可以被整体修饰,取匹配结果的时候,括号中的表达式匹配到的内容可以单独得到
贪婪模式
\w+, *, {m,n}在匹配的时候总是尽可能多的匹配符合它规则的字符,在可匹配可不匹配的时候,也是尽可能匹配,这种匹配原则叫做贪婪模式。
举例:
(d)(\w+)匹配dxxxdxxxd,匹配结果成功,共一个匹配结果,匹配位置开始于0,结束于8。
非贪婪模式
在修饰匹配次数的特殊符号后再加上一个"?",则可使匹配次数不定的表达式尽可能少的匹配,这种匹配的原则称为非贪婪模式,也叫勉强模式。
举例:
(d)(\w+?)匹配dxxxdxxxd,匹配结果成功,第一个匹配结果是dx,匹配位置开始于0,结束于1,第二个匹配结果是dx,匹配位置开始于4,结束于5。
反向引用
表达式在匹配时,表达式引擎会将小括号"()"包含的表达式所匹配到的字符串记录下来,在表达式后边的部分可以引用前面括号中匹配到的内容。引用方法是""加上一个数字,"\1"表示引用第一对括号内匹配到的字符串,"\2"引用第二对括号匹配到的字符串。嵌套括号的情况,按照左括号出现的顺序排序。
举例:
"('|")(.?)(\1)"在匹配" 'hello' , "world" "时,匹配结果成功,匹配到的内容是'hello',和 "world"
"<(\w+)\s(\w+(=('|").?\4)?\s)>.?</\1>"在匹配<td id='td1' style="bgcolor:white"></td>时,匹配结果是成功。
预搜索,不匹配
"(?=xxxxx)" 所在缝隙的右侧,必须能够匹配xxxxx表达式
举例:
"Windows (?=NT|XP)"在匹配"Windows 98, Windows NT, Windows 2000"时,将只匹配Windows NT中的Windows,其他的Windows字样则不被匹配。
"(\w)((?=\1\1\1))+"在匹配字符串"aaa ffffff 999999999"时,可以匹配6个f中的前四个,可以匹配9个9中的前7个。这个表达式可以解读为:重复4次以上的字母数字,则匹配其剩下最后两位之前的部分。
"(?!xxxxx)" 所在缝隙的右侧,必须不能匹配xxxxx表达式
举例:
"((?!\bstop\b).)+"在匹配"fdjka ljfdl stop fjdsla fdj"时,将从头一直匹配到"stop"之前的位置,如果字符串中没有"stop",则匹配整个字符串。匹配结果有两个,第一个匹配结果"fdjka ljfdl "和"top fjdsla fdj"
反向预搜索,不匹配
"(?<=xxxxx)" 所在缝隙的左侧,必须能够匹配xxxxx表达式
"(?<!xxxxx)" 所在缝隙的左侧,必须不能匹配xxxxx表达式
"(?<=\d{4})\d+(?=\d{4})" 在匹配"1234567890123456"时,将匹配除了前4个数字和后四个数字之外的中间8个数字。
网友评论