一、示例:
匹配数字(可能带小数点)
^-?d+(\.\d+)?$
解释:^是开始符,\d表示数字,+表示至少有一个,.表示小数点.,小括号表示分组,?表示小括号内的语句是可选的。
二、基础规则
1、常见匹配符号
表达式 | 说明 |
---|---|
[abc] | 复选集定义,匹配字母 a 或 b 或 c |
[abc] [vz] | 复选集定义,匹配字母 a 或 b 或 c,后面跟着 v 或 z |
[^abc] | 当插入符 ^ 在中括号中以第一个字符开始显示,则表示否定模式。此模式匹配所有字符,除了 a 或 b 或 c |
[a-d1-7] | 范围匹配,匹配字母 a 到 d 和数字从 1 到 7 之间,而不是不匹配 d1 |
X | Z |
XZ | 匹配 X 后直接跟着 Z |
2、字符集元字符
字符 | 说明 |
---|---|
\d | 匹配一个数字,是 [0-9] 的简写 |
\D | 匹配一个非数字,是 [^0-9] 的简写 |
\s | 匹配一个空格,是 [ \t\n\v\r\f] 的简写 |
\S | 匹配一个非空格,等同于[^\s] |
\w | 匹配一个单词字符(大小写字母、数字、下划线),是 [a-zA-Z_0-9] 的简写 |
\W | 匹配一个非单词字符(除了大小写字母、数字、下划线之外的字符),等同于 [^\w] |
3、重复匹配
* 匹配 >=0 个,是 {0,} 的简写 X* 表示匹配零个或多个字母 X,.* 表示匹配任何字符串
+ 匹配 >=1 个,是 {1,} 的简写 X+ 表示匹配一个或多个字母 X
? 匹配 1 个或 0 个,是 {0,1} 的简写 X? 表示匹配 0 个或 1 个字母 X
{X} 只匹配 X 个字符 \d{3} 表示匹配 3 个数字,.{10} 表示匹配任何长度是 10 的字符串
{X,Y} 匹配 >=X 且 <=Y 个 \d{1,4} 表示匹配至少 1 个最多 4 个数字
{X,} 匹配 >=X个 \d{1,} 表示匹配至少有一个数字,效果和+一样
4、防止过度匹配
上面的限定符中*,+和{X,}是“贪婪型”的,它们在进行匹配时表现为尽可能的匹配更多的字符,而不是匹配到碰到第一个匹配时为止。
而要阻止这种“贪婪”的行为,我们可以在其后面加上?即可,即*?, +?, {X,}?。这些叫懒惰型,表现为碰到第一个匹配时就停止。
我的理解是,贪婪型是从后往前匹配的懒惰型(懒惰就是匹配到第一符合就停止)。
5、位置匹配
a) 单词边界
\b表示单词的边界(一个单词的开始或者结尾)例如\bcat\b可以匹配文档中的cat这个单词,而不匹配scatteredb) 字符串边界
^表示字符串开头,$表示字符串结束
当^出现在字符集中([]中)开头时表示非,在外面并于一个模式开头时表示匹配字符串开始位置。c) 分行匹配模式
当文本不止一行时,默认:^匹配第一行开始的位置,$匹配最后一行结尾的位置。
但是当在模式前加上(?m)时,就开启了分行模式:^匹配每一行开始的位置,$匹配每一行结束的位置。
例如: (?m)^\s*//.*$,可以匹配java和js中的单独一行注释
解释:(?m)代表开启分行模式,可以匹配多行注释;\s*匹配//前面的空格;.*$匹配//后面到这行结尾的注释内容 如果没有(?m), 这个只能匹配第一行注释,并且一直匹配到文档结束,因为*是贪婪型
6、需要转义的字符(持续更新)
\ * + ( ) [ ] { } ?
这些符号出现在字符集合中(在[]中)时,不需要转义;相反'-'在[]外面不需要转义,在[]里面需要转义'\-'