正则表达式:贪婪模式

概述:在本教程中,您将了解贪婪量词及其工作原理。

所有 量词 默认情况下以贪婪模式工作。这意味着量词将尽可能多地匹配其前面的元素。

以下示例说明了贪婪量词的工作原理。

贪婪量词示例

假设您有一个表示按钮元素的 HTML 字符串

const button = '<button type="submit" class="btn">Send</button>';Code language: JavaScript (javascript)

您想要匹配双引号 ("") 中包含的文本,例如 submitbtn

为此,您使用双引号 (“),点 (.) 字符类 和 (+) 量词 来构建以下模式

/".+"/gCode 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)

要解决此问题,您需要指示量词 (+) 使用非贪婪(或懒惰)模式,而不是贪婪模式。为此,您在量词后面添加一个问号 (?),如下所示

/".+?"/gCode 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)

概述

  • 量词默认情况下使用贪婪模式。
  • 贪婪量词会尽可能多地匹配其前面的元素。
本教程是否有帮助?