一分钟使用正则表达式
最基本的正则表达式结构
符号 | 意义 |
---|---|
括号 | []内是需要匹配的字符,{}里是指定匹配字符的数量,()对表达式进行分组 |
^ | 表示正则表达式的开始 |
$ | 表示正则表达式的结束 |
$|表示正则表达式的结束
正则表达式就是在用一定的规则描述字符串。这个描述可以被用于未知字符串的验证,查找和替换。
基本规则
普通字符
字母、数字、汉字、下划线,以及在正则表达式里不代表特殊含义的字符
转义字符
表达式 | 匹配项 |
---|---|
\r,\n | 回车,换行 |
\t | 制表符 |
\\ | \ |
\^ | ^ |
$ | $ |
\. | . |
(\ ) | () |
\[\ ] | [] |
\{\} | {} |
\| | | |
\* | * |
\? | ? |
\+ | + |
要匹配到这些字符本身就需要使用转义字符,因为他们在正则表达式里面代表有特殊的含义
多种字符集合表示
表达式 | 匹配项 |
---|---|
\d | 0-9任意一个数字 |
\w | A-Za-z0-9和_,所有大小写字母,数字,及下划线中任意一个字符 |
\s | 空格,制表符,换页”\f”等空白字符中的一个 |
. | 除换行符以外的一个字符 |
自定义多字符表达式
表达式 | 可匹配 |
---|---|
[ab5@] | 匹配 “a” 或 “b” 或 “5” 或 “@” |
[^abc] | 匹配 “a”,”b”,”c” 之外的任意一个字符 |
[f-k] | 匹配 “f”~”k” 之间的任意一个字母 |
[^A-F0-3] | 匹配 “A”~”F”,”0”~”3” 之外的任意一个字符 |
这里的^意思是非
限定符
表达式 | 作用 |
---|---|
? | 匹配表达式0次或者1次,相当于 {0,1} |
+ | 表达式至少出现1次,相当于 {1,} |
* | 表达式不出现或出现任意次,相当于 {0,} |
自定义限定符表达式
表达式 | 作用 |
---|---|
{n} | 表达式重复n次 |
{m,n} | 表达式至少重复m次,最多重复n次 |
{m,} | 表达式至少重复m次 |
指位符
这一类符号在搜索的结果内不出现
表达式 | 作用 |
---|---|
^ | 与字符串开始的地方匹配,不匹配任何字符 |
$ | 与字符串结束的地方匹配,不匹配任何字符 |
\b | 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符 |
\b的特别说明
表达式”\bfhskd\b”匹配”sfjsfhskd skdfj fhskd mnv”时,只能匹配到fhskd。且表达式的意思是,两端拥有空格的fhskd
高级规则
匹配次数的贪婪与非贪婪
在使用限定符? + *时,默认是尽可能多的匹配。比如,”2333333”,使用”\b+”,会把整个字符串都匹配到,因为正则默认就是在贪婪模式,会尽可能多的匹配符合条件的字符串;”\b+?”只会匹配到一个”2”,?修饰的限定符出于非贪婪模式下,会匹配最小限度符合条件的字符串。
匹配结果的引用
()匹配出来的结果可以在下一次匹配的时候参与匹配。比如,匹配标签”< p>< /p>”(忽略里面的空格),就可以”<(\w+)>(.*?)(/\1)”,其中\1引用了(\w+)匹配出来的结果,使得前后的标签能够成双成对。要使用\后面的数字指的是从左往右,第几个(括住的表达式的结果,对嵌套的表达式同样有效。
非获取匹配的正反向预搜索
其实就是指位符的自定义版本
表达式 | 意义 |
---|---|
(?=pattern) | 放在匹配式的右边,只有在右边符合字符串pattern时,匹配部分才会配选中,而pattern不会被选中。”A(?=B)”通俗地讲就是找到右边带有B的A。 |
(?!pattern) | 右边不符合pattern时,匹配成功 |
(?<=pattern) | 放在匹配式的左边,且符合pattern时返回成功 |
(?<!pattern) | 左边不符合时,匹配成功 |
那么什么时非获取呢?比如,我们前面提到过()获取的内容可以使用\和数字来获取,这叫做获取匹配;上面的表达式也含有(),但是他们是非获取匹配。
除此以外,(?:pattern)是最后一个带括号的非获取匹配。例如,你需要查找industry industries这两个单词中的一个。你就可以”industr(?:y|ies)”,但是你也能够”industr(y|ies)”表示,只不过在需要获取匹配内容时,可能会使\的数字加1。
其他内容
多种字符补集
表达式 | 可匹配 |
---|---|
\S | 匹配所有非空白字符(”\s” 可匹配各个空白字符) |
\D | 匹配所有的非数字字符 |
\W | 匹配所有的字母、数字、下划线以外的字符 |
\B | 匹配非单词边界,即左右两边都是 “\w” 范围或者左右两边都不是 “\w” 范围时的字符缝隙 |
匹配模式
模式 | 说明 |
---|---|
i(ignorecase) | 匹配时忽略大小写 |
s(singleline) | 使.能匹配包括\n在内的所有符号 |
m(multiline) | 通常情况下,正则表达式只能匹配一行字符串,也就是遇见\n停下来。m可是正则表达式匹配多行字符串 |
g(global) | 一般情况,一旦有符合条件字符串,匹配即终止。g强调查找字符串中所有的匹配 |