1. 正则
- 正则是一种描述文本内容组成规律的表示方式
- 作用
- 校验数据的有效性
- 查找符合某个规则的文本
- 对文本进行切割和替换
1.1 符号
- 脱字符(^)表示非
2. 元字符(Metacharacter)
- [ ] ^ $-
\b匹配单词边界,如\w+\b - 完整匹配: ^ 和 $
2.1 特殊单字符
- 点号
.匹配任意单个字符(换行除外)- 匹配自身加转义
\.
- 匹配自身加转义
-
\d任意单个数字 [0-9]-
\D任意非数字 [^0-9]
-
-
\w字母+数字+下划线[A-Za-z0-9_]-
\W非\w -
\w+一般用来匹配单词
-
- 匹配单词
[a-z]+或\w+或\w+\b
2.2 空白符
-
\s能匹配上各种空白符号,也可以匹配上空格- 空白字符,包括但不限于空格,制表符,换行
[\f\n\r\t\v]
- 空白字符,包括但不限于空格,制表符,换行
-
\r回车 -
\n换行 -
\t制表符 -
\v垂直制表符 -
\f换页
2.3 量词(匹配多个字符)
-
?表示可选字符{0,1} -
+{1,} -
*{0,} -
{m,n}重复区间,代表 m 到 n 次,m是下限,n是上限(均为闭区间)-
\d{2,3}先按贪婪模式匹配,12345-12345 -
\d{2,3}?非贪婪模式,只匹配 2 个数字
-
- 注意:量词中的逗号之后不能有空格
匹配任意数据 .*?
(.|\n)*, (.|\s)*
2.4 范围
- 管道符号(
|)或,如:ab|cd -
[...]字符集合,也称自定义通配符-
[]只匹配一个字符,多选一,如[Jj]ava匹配Java or java - 字符区间可以用连字符(
-), 如[b-o-x];若要匹配横线,加转义[\-] - [^...],
^作用于字符集合里的所有字符或字符区间 - 点放入 [] 可以不加转义,如
[.] - 匹配中文用Unicode graphemica.com/
-
3. 量词与贪婪
- 贪婪模式,尽可能进行最长匹配
- 非贪婪模式,则会尽可能进行最短匹配
-
+, *是贪婪匹配,但是为了整体匹配,在适当情况下会少匹配些,贪婪模式要让位于整体匹配 - 加上
?表示非贪婪,示例.+?,非贪婪模式也会让位于整体匹配所以某些情况会多匹配些
3.1 贪婪匹配(Greedy)
- 在正则中,表示次数的量词默认是贪婪的,在贪婪模式下,会尝试尽可能最大长度去匹配
对比 a+ 与 a*
a* 匹配了三次空字符串,因为星号(*)代表 0 到多次,匹配 0 次就是空字符串
image.png
3.2 非贪婪匹配(Lazy)
- 在量词后面加上英文问号 (?),可将贪婪模式变成非贪婪模式
image.png
3.3 独占模式(Possessive)
- 不管是贪婪模式,还是非贪婪模式,都需要发生回溯才能完成相应的功能
- 量词后面加上加号(+)
- 独占模式和贪婪模式很像,独占模式会尽可能多地去匹配,如果匹配失败就结束,不会进行回溯,这样的话就比较节省时间
字符 xyyz
xy{1,3}z 首先匹配 3 个 y, 但正则 z 会匹配不上,此时正则向前回溯,吐出当前字符 z,接着用正则中的 z 去匹配
image.png
xy{1,3}?z 首先匹配 1 个 y, 但 z 会匹配不上,此时向前回溯...
独占模式xy{1,3}+yz 不能匹配到 xyyz
3.4 贪婪分析
-
dxxxxdxxxd-d.+d虽然让位于整体匹配,但也是在尽可能多的匹配情况下 -
dxxxxdxxxd-d.+?- 会匹配两个 dx -
dxxxxdxxxd-d.+?d- 匹配一个dxxxxd









网友评论