正则表达式量词
量词构成
量词指定前面的正则表达式结构的匹配频率。量词分为以下几类:
- 贪心
- 不太愿意
- 所有格
组合量词、量词和所有量词之间的区别在于:要尝试字符串的哪个部分进行初始匹配,以及如果初始尝试未产生匹配项,则如何重试。
默认情况下,量词为
“合适”
。贪心量词首先尝试将其与整个输入字符串进行匹配。如果生成匹配项,则会认为匹配成功,并且引擎可以移至使用正则表达式中的下一个构造。如果第一次尝试未找到匹配项,引擎会一次后退一个字符,直到找到匹配项。因此,贪心量词会按从最长的输入字符串到最短的输入字符串的顺序,即从右到左递归地尝试检查可能的匹配项。添加
?
(问号) 映射到一个“不顾一切”的量词,会使其 “不情愿”
。对于不匹配的量词,首先会从输入字符串的开头尝试匹配,从与正则表达式构造匹配的尽可能短的字符串开始。如果生成匹配项,则会认为匹配成功,并且引擎可以移至使用正则表达式中的下一个构造。如果第一次尝试未找到匹配项,引擎会一次添加 1 个字符,直到找到匹配项。因此,不规则量词会按照从尽可能短的输入字符串到尽可能最长的输入字符串的顺序,递归地从左到右尝试检查可能的匹配项。添加
+
(加号)到一个量词“”会使其 具有所有格
。所有格量词在第一次尝试时就像一个贪心量词(它尝试与整个输入字符串进行匹配)。区别在于,与过度限定量词不同,所有格量词在未找到匹配项时不会重新尝试使用较短的字符串。如果初始匹配失败,所有格量词会报告匹配失败。它不再进行任何尝试。贪心构造 | 不情愿的构成 | 构成所有格 | 描述 | 示例 |
|---|---|---|---|---|
?
| ??
| ?+
| 匹配前一个字符或构造一次,或者不匹配。 | st?on 匹配“johnson”中的“son”和“johnston”中的“ston”,但不匹配“clinton”或“version” |
*
| *?
| *+
| 匹配前一个字符或构造零次或多次。 | if* 匹配“diff”中的“if”或“iff”或“print”中的“i” |
+
| +?
| ++
| 匹配前一个字符或构造 1 次或多次。 | if+ 匹配“diff”中的“if”和“iff”,但不匹配“print”中的内容 |
{n}
| {n}?
| {n}+
| 恰好匹配前一个字符或构造 n 次。 | o{2} 匹配“lookup”中的“OO”以及“foooio”中的前 2 个 o,但不匹配“mount”中的内容 |
{n,}
| {n,}?
| {n,}+
| 匹配前一个字符或构造至少 n 次。 | o{2,} 匹配“fooo”中的所有 5 个 o,但不匹配“mount”中的任何内容 |
{n,m}
| {n,m}?
| {n,m}+
| 匹配前一个字符或构造至少 n 次,但不超过 m 次。 | F{2,4} 匹配“#FF0000”中的“FF”和“#FFFFFF”中的最后 4 个 F |