一、示例:
匹配数字(可能带小数点)
代码语言:java复制 ^-?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 | 匹配一个空格,是 tnvrf 的简写 |
S | 匹配一个非空格,等同于^s |
w | 匹配一个单词字符(大小写字母、数字、下划线),是 a-zA-Z_0-9 的简写 |
W | 匹配一个非单词字符(除了大小写字母、数字、下划线之外的字符),等同于 ^w |
3、重复匹配
代码语言:bash复制 * 匹配 >=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表示单词的边界(一个单词的开始或者结尾)例如bcatb可以匹配文档中的cat这个单词,而不匹配scattered
b) 字符串边界 ^表示字符串开头,$表示字符串结束 当^出现在字符集中([]中)开头时表示非,在外面并于一个模式开头时表示匹配字符串开始位置。
c) 分行匹配模式 当文本不止一行时,默认:^匹配第一行开始的位置,$匹配最后一行结尾的位置。 但是当在模式前加上(?m)时,就开启了分行模式:^匹配每一行开始的位置,$匹配每一行结束的位置。
<br> 例如:<b color='#000'>(?m)^s*//.*$</b>,可以匹配java和js中的单独一行注释 <br> 解释:(?m)代表开启分行模式,可以匹配多行注释;s*匹配//前面的空格;.*$匹配//后面到这行结尾的注释内容 如果没有(?m), 这个只能匹配第一行注释,并且一直匹配到文档结束,因为*是贪婪型
6、需要转义的字符(持续更新)
代码语言:bash复制 * ( ) [ ] { } ?
这些符号出现在字符集合中(在[]中)时,不需要转义;相反'-'在[]外面不需要转义,在[]里面需要转义'-'