正则表达式学习
元字符
字符 | 描述 | 例子 |
---|---|---|
|将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符 | '\n' 匹配一个换行符,序列 '\\' 匹配 "\", 而 "\(" 匹配 "("。 | |
. | 匹配除换行符(\n、\r)之外的任何单个字符 | |
[xyz] | 字符集合。匹配所包含的任意一个字符 | '[aeiou]' 可以匹配 "hello" 中的 'e'、'o' |
[^xyz] | 非字符集合。匹配未包含的任意字符 | '[^aeiou]' 可以匹配 "hello" 中的 'h'、'l' |
[a-z] | 字符范围。匹配指定范围内的任意字符 | '[a-z]' 可以匹配 "Hello World"中的 'e'、'l'、'o'、'r'、'l'、'd' |
[^a-z] | 非字符范围。匹配任何不在指定范围内的任意字符 | '[a-z]' 可以匹配 "Hello World"中的 'H'、'W' |
\d | 匹配一个数字字符,等价于 [0-9] | '\d'可以匹配到'123456'中的所有字符,'\d\d'可以匹配到'123456'中'12'、'34'、'56'、,'\d\d\d'可以匹配到'123456'中'123'、'456' |
\D | 匹配一个非数字字符,等价于 [^0-9] | '\D'可以匹配'hello123456'中所有非数字的字符,'h'、'e'、'l'、'o' |
\w | 匹配字母、数字、下划线,等价于'[A-Za-z0-9_]' | '\w'可以匹配到'hello_.name'中除了'.'外的字符 |
\W | 匹配非字母、数字、下划线,等价于 '[^A-Za-z0-9_]' | '\w'可以匹配到'hello_.name'中.的字符 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等,等价于 [ \f\n\r\t\v] | '\s'可以匹配到'hello 123456'中的空格符 |
\S | 匹配任何非空白字符,等价于 [^ \f\n\r\t\v]。 | '\s'可以匹配到'hello 123456'中所有非空格符,如'h'、'e'、'l'等 |
数量修饰
字符 | 描述 | 例子 |
---|---|---|
* | 任意多次,>=0 | '\d'可以匹配'1 12 123'中所有的单字符,'\d*'则匹配的是'1'、'12'、'123' |
+ | 至少一次,>=1 | '\d'可以匹配'1 12 123'中所有的单字符,'\d*'则匹配的是'1'、'12'、'123' |
? | 可有可无,0|1次 | '\d'可以匹配'1 12 123'中所有的单字符,'\d\d?'则匹配的是'1'、'12'、'12'、'3' |
固定m次 | '\d'可以匹配'1 12 123'中所有的单字符,'\d{3}'则匹配的是'123' | |
至少m次 | '\d'可以匹配'1 12 123'中所有的单字符,'\d{2,}'则匹配的是'12'、'123' | |
m-n次 | '\d'可以匹配'1 12 123 12345'中所有的单字符,'\d{3,5}'则匹配的是'123'、'12345' |
表示边界
字符 | 描述 | 例子 |
---|---|---|
\b | 匹配一个单词边界,也就是指单词和空格间的位置 | 'o\b' 可以匹配到 "Hello World Hello\t Hello\n Hello;"中所有的'Hello' |
\B | 匹配非单词边界 | 'o\b' 可以匹配到 "Hello World Hello\t Hello\n Hello;"中 'World' |
^ | 以某某开头 | '\d+'可以匹配到"haha123"中的'123','^\d+'则要求以数字开头,所以匹配不到 |
$ | 以某某结尾 | '\d+'可以匹配到"haha123d"中的'123','\d+$'则要求以数字结尾,所以匹配不到 |
分组
字符 | 描述 | 例子 |
---|---|---|
() | 视为一个整体,(){}匹配()中的内容多次 | '1(6){2}(8){8}'可以匹配"16688888888" |
() | 子模式 组模式 \1 \2 \3 | '\d{2}(\d{2})-(\d{2})-(\d{2}) \1:\2:\3'可以匹配'2020-05-08 20:05:08',其中\1 是 20,\2是 05,\3是08 |
贪婪与非贪婪
字符 | 描述 | 例子 |
---|---|---|
.* | 先匹配至输入串的最后, 然后向前匹配, 直到可以匹配 | '1.*1'可以匹配到"101000001"中"101000001" |
.?* | 匹配下一个字符之前的所有字符 | '1.*?1'可以匹配到"101000001"中"101" |
零宽断言
需求
在使用正则表达式时,有时我们需要捕获的内容前后必须是特定内容,但又不捕获这些特定内容的时候,零宽断言就起到作用了
基本概念
零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配结果只是一个位置而已。
作用是给指定位置添加一个限定条件,用来规定此位置之前或者之后的字符必须满足限定条件才能使正则中的字表达式匹配成功。
注意:这里所说的子表达式并非只有用小括号括起来的表达式,而是正则表达式中的任意匹配单元。
正/反向零宽断言
-
(?=pattern) 正向肯定预查
-
(?!pattern) 正向否定预查
-
(?<=pattern) 反向肯定预查
-
(?<!pattern) 反向否定预查