1. 常用量词
1.1 量词 (+)
示例:ab+
vs (ab)+
![](https://img.haomeiwen.com/i20154612/893acdecdf3c6b2b.png)
![](https://img.haomeiwen.com/i20154612/533ec23f95adf8f9.png)
1.2 量词 (?)
![](https://img.haomeiwen.com/i20154612/f2543b5879bd9f1f.png)
1.3 量词 (*)
匹配双引号字符串(可以为空串 "")
正则表达式 "[^"]*"
![](https://img.haomeiwen.com/i20154612/4cbc7d60a0cf5cda.png)
2. 通用形式的量词
-
{m,n}
逗号之后不能有空格 -
{n}
出现 N 次 -
{m,n}
出现 m ~ n 次 -
{m,}
至少 m 次 -
{0,n}
最多 N 次,隐式的上限是65536
2.1 匹配数字
![](https://img.haomeiwen.com/i20154612/9342a74d38e619c1.png)
试试 \d{2,3}?
, \d{2,3}+
2.2 匹配数字2
![](https://img.haomeiwen.com/i20154612/9ab630e156387006.png)
![](https://img.haomeiwen.com/i20154612/43ce2147b100737d.png)
2.3 匹配数字 - 边界
\d{15}|\d{18}
匹配结果不准确,因为18 位数字也会匹配上前 15 位
![](https://img.haomeiwen.com/i20154612/5ca95dc7b811c1de.png)
试试 ^(\d{15}|\d{18)$
3. 量词的三种模式
- 不管是贪婪或非贪婪,都会让位于整体匹配
Greedy | 数量词 | Reluctant | 数量词 | Possessive | 数量词 |
---|---|---|---|---|---|
X? | X{0,1} | X?? | X{0,1} | X?+ | X{0,1} |
X* | X{0,} | X*? | X*+ | --- | |
X+ | X{1,} | X+? | X++ | --- | |
X{n} | --- | X{n}? | X{n}+ | --- | |
X{n,} | --- | X{n,}? | X{n,}+ | --- | |
X{n,m} | --- | X{n,m}? | X{n} | X{n,m}+ | X{n,m} |
3.1 Greedy 量词
-
+, *
是贪婪匹配
![](https://img.haomeiwen.com/i20154612/30ba23ae0cc96db3.png)
*
代表 0 到多次,匹配 0 次就是空字符串
![](https://img.haomeiwen.com/i20154612/f6f15eee453dcfaf.png)
3.2 Reluctant 量词
- 在量词后面加上英文问号 (?),可将贪婪模式变成非贪婪模式
![](https://img.haomeiwen.com/i20154612/66cbf87ac6d63aaf.png)
![](https://img.haomeiwen.com/i20154612/d22bc585ef699798.png)
3.3 回溯
- 不管是贪婪模式,还是非贪婪模式,都需要发生回溯才能完成相应的功能
![](https://img.haomeiwen.com/i20154612/57e6e18c1d7f51da.png)
![](https://img.haomeiwen.com/i20154612/eff6b56c8843bbf0.png)
xy{1,3}z
首先匹配 3 个 y, 但正则 z 会匹配不上,此时正则向前回溯,吐出当前字符 z,接着用正则中的 z 去匹配
xy{1,3}?z
首先匹配 1 个 y, 但 z 会匹配不上,此时向前回溯...
3.4 独占模式 (Possessive)
- 量词后面加上加号(+)
- 独占模式和贪婪模式很像,独占模式会尽可能多地去匹配,如果匹配失败就结束,不会进行回溯,这样的话就比较节省时间
独占模式 xy{1,3}+y
只能匹配 xyyyy
![](https://img.haomeiwen.com/i20154612/f7e797483b29b400.png)
其他:xy{1,3}?y
只能匹配 xyy
![](https://img.haomeiwen.com/i20154612/3025fb18cac2a143.png)
4. 实战
字符串 "dxxxxdxxxd"
d.+d
贪婪匹配,虽然让位于整体匹配,但也是在尽可能多的匹配情况下
d.+?d
非贪婪匹配,匹配一个dxxxxd
d.+?
会匹配两个 dx
![](https://img.haomeiwen.com/i20154612/340cb6bc3f82de8a.png)
![](https://img.haomeiwen.com/i20154612/f62cfbdbc86322cd.png)
![](https://img.haomeiwen.com/i20154612/5f9731b3c5bd597a.png)
网友评论