您的位置:首页 > 其它

正则表达式笔记

2016-12-22 16:28 155 查看

标准字符集合

标准字符集合是能够与“多种字符”匹配的表达式,要注意区分大小写,大写是相反的意思。

\d 任意一个数字,0~9中的任意一个
\D 就是除了0~9之外的所有字符

\w 任意一个字母或数字或下划线,也就是A~Z,a~z,0~9,_中任意一个。
\W 与\w的意思相反,除了字母数字下划线的任意一个字符

\s 包括空格、制表符、换行符等空白字符的中的任意一个。
\S 除了空格制表符换行符等空白字符的任意一个。
如果要匹配包括“\n”在内的所有字符,一般用[\s\S]。

. 小数点可以匹配除了换行符以外的任意一个字符。

\^ 反斜杠加尖角号,匹配尖角号

自定义字符集合

[]方括号匹配方式,能够匹配方括号中任意一个字符
[ab5@] 匹配“a”或“b”或“5”或“@”
[^abc] 匹配除了a、b、cy以外的任意字符,“^”表示取反。

[a-h] 匹配a~h之间的任意字符

[^A-F0-3] 匹配A~F,0~3之外的任意一个字符

正则表达式的特殊符号,被包含到中括号中,则失去特殊意义,除了^、-之外。
标准字符集合,除小数点外,如果被包含到中括号中,自定义字符集合将包含该集合。比如:[\d.\-+]将匹配数字、小数点、-、+。

量词(Quantifier)

——修饰匹配次数的特殊符号

{n} 表达式重复n次
例如:\d{6}将匹配6位数字,\d\d{6}将匹配7位数字,如果想重复匹配表达式\d\w6次,那么应该这样写:(\d\w){6}

{m,n} 表达式至少重复m次,最多重复n次
例如:\d{3,6}将匹配至少3位数字,至多6位数字

这里,要提到一个贪婪模式和非贪婪模式。假设有一个字符串“123456”,当用正则表达式\d{3,6}来匹配时,字符串“123456”将被当成6位数字来匹配,此为贪婪模式,这是正则表达式引擎默认的,如果要取消贪婪模式,可以在正则表达式后面加一个“?”,即\d{3,6}?,这样,字符串“123456”将被当成两个3位数字来匹配。

{m,}  表达式至少重复m次。注意:没有{,m}这种写法
例如:\d{3,}将匹配所有位数大于3的数字

假设有一个字符串“ab a1b a12b a123b a1234b”,
如果在\d后面加一个“?”,表示匹配表达式0字或者1次,相当于{0,1},那么表达式“a\d?b”会被匹配到的字符串有“ab”、“a1b”。
如果在\d后面加一个“+”,表示匹配表达式至少1次,相当于{1,},那么表达式“a\d+b”会被匹配到的字符串有“a1b”、“a12b”、“a123b”、“a1234b”。

如果在\d后面加一个“*”,表示匹配表达式不出现或者出现0次,相当于{0,},那么表达式“a\d*b”会被匹配到的字符串有“ab”、“a1b”、“a12b”、“a123b”、“a1234b”。

字符边界

——本组标记匹配的不是字符而是位置,符合某种条件的位置

字符边界匹配的时候是零宽的。
^匹配字符串开始的地方;
$匹配字符串结束的地方;
\b匹配一个单词边界,\b匹配的时候遵循的原则是——前面的字符和后面的字符不全是\w(任意一个字母或数字或下划线,也就是A~Z,a~z,0~9,_中任意一个)。

如果有这样一个字符串“abcdefga”,^a匹配的a是字符串开头位置的a,字符串末尾的a不会被匹配;a$匹配的a是字符串末尾的a,字符串开头的a不会被匹配。
假设一个字符串“hello hello22 111hello”,hello\b会匹配到hello和111hello中的hello,而hello22中的hello不会被匹配到。

正则表达式的匹配模式

    1.IGNORECASE 忽略大小写

    匹配时忽略大小写。默认情况下,正则表达式是要区分大小写的。

    2.SINGLELINE 单行模式

    整个文本看做一个字符串,只有一个开头,一个结尾。使小数点“.”可以匹配包含换行符(\n)在内的任意字符。

    3.MULTILINE 多行模式

    每行都是一个字符串,都有开头和结尾。在指定了MULTILINE后,如果需要仅匹配字符串开始和结束位置,可以使用\A和\Z。

选择符和分组

| 分支结构 
左右两边表达式之间“或”关系,匹配左边或者右边
() 捕获组 
(1).在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2).取匹配结果的时候,括号中的表达式匹配到的内容可以单独得到
(3).每一对括号会分配一个编号,使用()的捕获组根据左括号的顺序从1开始自动编号,捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本
(?:Expression) 非捕获组
一些表达式中,不得不使用(),但又不需要保存()中子表达式匹配的内容,这时可以用非捕获组来抵消使用()带来的副作用。

反向引用(\nnn)

  每一对()会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号。
  通过反向引用,可以对分组已捕获的字符串进行引用。

预搜索(零宽断言)

只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度。
这个位置应该符合某个条件。判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符。是对当前位置的匹配。
正则表达式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的,如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度的。占有字符还是零宽度,是针对匹配的内容是否保存到最终的匹配结果中而言的。

(?=exp)断言自身出现的位置的后面能匹配表达式exp

(?<=exp)断言自身出现的位置的前面能匹配表达式exp
(?!exp)断言此位置的后面不能匹配表达式exp
(?<!exp)断言此位置的前面不能匹配表达式exp

(?=exp)、(?!exp)要放在要匹配的表达式的后面,(?<=exp)、(?<!exp)要放在要匹配的表达式的前面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  正则表达式