http://blog.csdn.net/lxcnn/article/details/4146148 读书笔记
基础概念 1.字符串组成:字符+位置 [0]a[1]a[2]v[3] 字符:a a v 位置:0,1,2,3
2.占有字符和零宽度 匹配过程中,如果子表达式匹配到的是字符内容而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的;如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度的。 一个字符,同一时间只能有一个子表达式匹配,而一个位置,却可以同时由多个零宽度的子表达式匹配。
3.1 元字符——字符组 [] 字符组:字符组可以匹配[]中包括的任意一个字符,只能是一个 字符组支持由“-”来表示的一个范围 [^…]排除型字符组表示任意一个未列出的字符,同样只能是一个
表达式 | 说明 |
---|---|
[abc] | “a”或者“b”或者“c” |
[0-9] | 0-9中任意一个数字 |
[\u4e00-\u9fa5] | 任意一个汉字 |
[^a1<] | 除了“a”“1”“<”外的任意一个字符 |
[^a-z] | 除小写字母外的任意一个字符 |
3.2 元字符——常见字符范围缩写
表达式 | 说明 |
---|---|
\d | 任意一个数字 |
\w | 任意一个字母或者下划线 |
\s | 任意空白字符 |
\D | 任意一个非数字字符,\d取反,相当于[^0-9] |
\W | \w取反 |
\S | 任意非空白字符 |
3.3 元字符——小数点
表达式 | 说明 |
---|---|
. | 匹配除了换行符\n以外的任意一个字符 |
3.4 元字符——其他元字符
表达式 | 说明 |
---|---|
^ | 匹配字符串开始的位置,不匹配任何字符 |
$ | 匹配字符串结束的位置,不匹配任何字符 |
\b | 匹配单词边界,不匹配任何字符 |
3.5 元字符——转义字符 一些不可见(回车、换行),或者是在正则中具有特殊意义的元字符,如果想匹配字符本身,需要用“\”对其进行转义
3.6 元字符——量词 量词表示一个子表达式可以匹配的次数
表达式 | 说明 |
---|---|
{m} | 匹配m次 |
{m,n} | 最少匹配m次,最多n次 |
{m, } | 至少匹配m次 |
? | 匹配0次或者1次 |
* | 匹配0次或任意多次 |
+ | 匹配1次或任意多次,至少1次 |
3.7 元字符——分支
表达式 | 说明 |
---|---|
| | 多个子表达式之间取“或”的关系 |
正则表达式从左到右依次匹配,如果满足了某个分支的话,他就不会再管其他分支了 |
其他 1.捕获组 就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或者显示命名的组里,方便后面引用
表达式 | 说明 |
---|---|
(expression) | 将子表达式expression匹配的内容保存到以数字编号的组里 |
(?expression) | 命名捕获组,将子表达式expression匹配的内容保存到以name命名的组里 |
2.非捕获组 | |
一些表达式中,不得不使用( ),但是又不需要保存( )中子表达式匹配的内容,这时可以用非捕获组来抵消使用( )的副作用 |
表达式 | 说明 |
---|---|
(?:expression) | 进行子表达式expression的匹配,并将匹配内容保存到最终的整个表达式的匹配结果中,但expression匹配的内容不单独保存到一个组内 |
3.反向引用 正则表达式中,对前面捕获组捕获的内容进行引用。捕获组捕获的内容,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用 反向引用通常用来查找重复的子串,或是限定某一子串成对出现
表达式 | 说明 |
---|---|
\1,\2 | 对序号为1和2的捕获组的反向引用 |
\k | 对命名为name的捕获组的反向引用 |
练习:12位的数字,并且其中不能出现6位连续相同的数字 | |
需求分析 | |
➢ 一个数字 | |
➢ 它后面不能连续出现5个与它相同的数字 | |
➢ 12位 | |
对应正则 | |
➢ ([0-9]) | |
➢ (?!\1{5}) | |
➢ {12} | |
最后结果 | |
(([0-9])(?!\1{5})){12} | |
"([ab])\1"匹配"abcdebbcde"时,匹配结果是"bb" |
4.断言:只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度的。
表达式 | 说明 |
---|---|
(?<=expression) | 逆序肯定,表示所在位置左侧能够匹配expression |
(?<!expression) | 逆序否定,表示所在位置左侧不能匹配expression |
(?=expression) | 顺序肯定,表示所在位置右侧能够匹配expression |
(?!expression) | 顺序否定,表示所在位置右侧不能匹配expressions |
“(?!1)\d+”匹配”123”时,匹配结果是”23” | |
"[a-z]*(?=ing)"匹配"cooking singing"时,匹配结果是"cook" | |
".*(?=ing)"匹配"cooking singing"时,匹配结果是"cooking sing" | |
"(?<=abc).*"匹配"abcdefg"时,匹配结果是"defg" |
5.贪婪、非贪婪模式 贪婪模式:标准量词修饰的子表达式,在可匹配可不匹配的情况下,总会先尝试进行匹配,称这种方式为匹配优先,或者贪婪模式 量词:”{m}”,”{m,n}”,”{m, }”,”?”,””,”+” 非贪婪模式:一些NFA正则引擎支持忽略优先量词,也就是在标准量词后加一个”?”,此时,在可匹配可不匹配的情况下,总会先忽略匹配,只有在由忽略优先量词修饰的子表达式,必须进行匹配才能使整个表达式匹配成功时,才会进行匹配,这种方式称为忽略优先,或者非贪婪模式 量词:”{m}?”,”{m,n}?”,”{m, }?”,”??”,”?”,”+?”
举例
字符串:<div>dssss</div><div>asfdf</div> 表达式1:<div>.</div> 结果:<div>dssss
2014-08-25