正则笔记之量词

概述

本文主要总结正则表达式中量词相关的知识点

上篇文章:

正则笔记之字符组

补充知识点:

  • 当点号在中括号中表示普通字符,不是元字符,例如:  [.]

  • 点好匹配的字符中包括其点号字符本身, 但是不包括  \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,}
* \*
+ \+
? \?
*? \*\?
+? \+\?
?? \?\?