概述:在本教程中,您将了解贪婪量词及其工作原理。
所有 量词 默认情况下以贪婪模式工作。这意味着量词将尽可能多地匹配其前面的元素。
以下示例说明了贪婪量词的工作原理。
贪婪量词示例
假设您有一个表示按钮元素的 HTML 字符串
const button = '<button type="submit" class="btn">Send</button>';
Code language: JavaScript (javascript)
您想要匹配双引号 (""
) 中包含的文本,例如 submit
和 btn
。
为此,您使用双引号 (“),点 (.
) 字符类 和 (+
) 量词 来构建以下模式
/".+"/g
Code language: JavaScript (javascript)
此模式意味着
"
以"
开头.
匹配除换行符之外的任何字符+
匹配前面的字符一次或多次"
以"
结尾g
标志返回所有匹配项
以下使用 match()
方法将字符串 s
与模式匹配
const s = '<button type="submit" class="btn">Send</button>';
const pattern = /".+"/g;
const result = s.match(pattern);
console.log(result);
Code language: JavaScript (javascript)
输出
['"submit" class="btn"']
Code language: JavaScript (javascript)
它返回 '"submit" class="btn"'
而不是 submit
” 和 btn
。
原因是在贪婪模式下,量词 (+
) 会尽可能多地匹配前面的元素 (".
)。
贪婪量词的工作原理
首先,正则表达式引擎从字符串 s
中的第一个字符开始匹配。
接下来,因为第一个字符 <
与引号 ("
) 不匹配,所以正则表达式引擎继续匹配后面的字符,直到找到第一个引号 ("
)
然后,正则表达式引擎使用正则表达式中的下一个规则 .+
来匹配字符串。
由于 .+
规则匹配一个或多个字符,所以正则表达式引擎会匹配字符,直到遇到字符串的结尾。
之后,正则表达式引擎检查正则表达式中的最后一个规则,即引号 (“)。但是,由于它已经到达字符串的结尾,所以没有更多的字符可以匹配。这意味着正则表达式引擎过于贪婪,匹配的范围超出了预期。
最后,正则表达式引擎从字符串的结尾返回,找到引号 (“)。此步骤通常称为回溯。
因此,匹配的是以下子字符串,这并非您预期的结果。
"submit" class="btn"
Code language: JavaScript (javascript)
要解决此问题,您需要指示量词 (+
) 使用非贪婪(或懒惰)模式,而不是贪婪模式。为此,您在量词后面添加一个问号 (?
),如下所示
/".+?"/g
Code language: JavaScript (javascript)
以下脚本返回预期的结果
const s = '<button type="submit" class="btn">Send</button>';
const pattern = /".+?"/g;
const result = s.match(pattern)
console.log(result);
Code language: JavaScript (javascript)
输出
['"submit"', '"btn"']
Code language: JavaScript (javascript)
概述
- 量词默认情况下使用贪婪模式。
- 贪婪量词会尽可能多地匹配其前面的元素。
本教程是否有帮助?