正则笔记之量词
2010 年 7 月 28 日
概述
本文主要总结正则表达式中量词相关的知识点
上篇文章:
补充知识点:
-
当点号在中括号中表示普通字符,不是元字符,例如:
[.]
。 -
点好匹配的字符中包括其点号字符本身, 但是不包括
\n
。
贪婪量词
定义
匹配优先, 在拿不准要匹配的时候,优先尝试匹配,并记录下这个状态,以备将来回溯。
量词的形式
量词 | 说明 |
---|---|
{n} | 之前的元素必须出现 n 次 |
{m,n} | 之前的元素至少出现 m 次, 至多出现 n 次 |
{m,} | 之前的元素至少出现 m 次, 出现次数无上限 |
{0,n} | 之前的元素可以不出现, 也可以出现, 最多出现 n 次 |
* | 等价于 {0,} |
+ | 等价于 {1,} |
? | 等价于 {0,1} |
注意事项:
-
{m,n}
之间不能出现空格 -
{m,}
重复次数并非没有上限, 隐式上限 65535。一般情况下, 这个上限是够用的,所以可以认为不存在上限 -
有些语言的
{0,n}
也可以写作{,n}
, 但是 大多数语言不支持这种写法, 比如: Java。
实例
什么是回溯
从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。这种不断“前进”、不断“回溯”寻找解的方法,就称作“回溯法”。本质上就是深度优先搜索算法。其中退到之前的某一步这一过程,我们称为“回溯”。具体如下图(图片来自网络,侵删):
懒惰量词
定义
如果不确定是否要匹配, 优先选择 “不匹配”的状态, 在尝试表达式中之后的元素, 如果阐释失败了, 再回溯, 选择之前保存的状态。
量词的形式
懒惰量词 | 贪婪量词 | 说明 |
---|---|---|
{n}? | {n} | 之前的元素必须出现 n 次 |
{m,n}? | {m,n} | 之前的元素至少出现 m 次, 至多出现 n 次 |
{m,}? | {m,} | 之前的元素至少出现 m 次, 出现次数无上限 |
{0,n} | {0,n} | 之前的元素可以不出现, 也可以出现, 最多出现 n 次 |
*? | * | 等价于 {0,} |
+? | + | 等价于 {1,} |
?? | ? | 等价于 {0,1} |
注意: 由于懒惰量词要兼顾它所在限定的元素与之后的元素,效率大大降低。
实例
转义
多于常用的 +*?
来说, 如果希望表示三个字符本身, 直接添加反斜线, 变成 \+ \* \?
即可。懒惰量词需要两个词都转义, 比如 *?
写成 \*\?
而不是 \*?
。
各种量词转义
量词字符 | 转义形式 |
---|---|
{n} | \{n} |
{m,n} | \{m,n} |
{m,} | \{m,} |
* | \* |
+ | \+ |
? | \? |
*? | \*\? |
+? | \+\? |
?? | \?\? |