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 次就是空字符串
3.2 非贪婪匹配(Lazy)
- 在量词后面加上英文问号 (?),可将贪婪模式变成非贪婪模式
3.3 独占模式(Possessive)
- 不管是贪婪模式,还是非贪婪模式,都需要发生回溯才能完成相应的功能
- 量词后面加上加号(+)
- 独占模式和贪婪模式很像,独占模式会尽可能多地去匹配,如果匹配失败就结束,不会进行回溯,这样的话就比较节省时间
字符 xyyz
xy{1,3}z
首先匹配 3 个 y, 但正则 z 会匹配不上,此时正则向前回溯,吐出当前字符 z,接着用正则中的 z 去匹配
xy{1,3}?z
首先匹配 1 个 y, 但 z 会匹配不上,此时向前回溯...
独占模式xy{1,3}+yz
不能匹配到 xyyz
3.4 贪婪分析
-
dxxxxdxxxd
-d.+d
虽然让位于整体匹配,但也是在尽可能多的匹配情况下 -
dxxxxdxxxd
-d.+?
- 会匹配两个 dx -
dxxxxdxxxd
-d.+?d
- 匹配一个dxxxxd
网友评论