Skip to content

Latest commit

 

History

History
executable file
·
148 lines (110 loc) · 5.97 KB

20140731_regex_01.md

File metadata and controls

executable file
·
148 lines (110 loc) · 5.97 KB

yeol

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

asfdf</div> 表达式2:<div>.?</div> 结果:<div>dssss</div>

2014-08-25