如何使正则表达式变成非贪婪?

正则表达式是处理文本的强大工具,但默认情况下它们会尽可能匹配尽可能多的字符,这被称为“贪婪匹配”。有时候,我们需要让正则表达式以“非贪婪”的方式匹配,以便我们能够得到我们想要的结果。在本文中,我将介绍如何通过添加一个问号来使正则表达式变成非贪婪。

贪婪匹配和非贪婪匹配

在正则表达式中,量词(如 *、+、?、{n} 和 {n,m})用于指示前面的模式应该重复多少次。默认情况下,量词是贪婪的,意味着它们将尽可能多地匹配文本。

例如,考虑以下字符串:

--------- ---------------------------

如果使用贪婪匹配的正则表达式 /<.*>/,它将匹配整个字符串 <p>Hello, <strong>world</strong>!</p>,而不仅仅是 <p></p> 之间的部分。这是因为 .* 匹配了任何字符和任何数量的字符,包括 <strong></strong> 标签。

相反,非贪婪匹配将尽可能少地匹配文本。要使正则表达式变成非贪婪的,我们可以在量词后面添加一个问号。

例如,使用非贪婪匹配的正则表达式 /<.*?>\w*<\/.*?>/ 将仅匹配 <strong>world</strong>,而不是整个字符串。这是因为 .*? 仅匹配任意字符的最小可能数量,直到它与 \w* 匹配为止,然后再匹配 </.*?>

示例代码

以下是一个 JavaScript 示例,它演示了如何使用非贪婪匹配寻找 HTML 标签中的文本:

----- ---- - ---------- -----------------------------
----- ----- - -------------------
----- ------- - ------------------
--------------------- -- --------------------------

在上面的代码中,我们使用非贪婪匹配的正则表达式 /\<.*?\>\w*\<\/.*?\>/g 来搜索 HTML 字符串中的文本。由于我们使用了全局标志 g,因此会匹配多次。然后,我们将所有匹配项存储在数组 matches 中,并将其打印到控制台上。

结论

通过使用非贪婪匹配,我们可以轻松地让正则表达式只匹配我们需要的部分。在处理文本时,这是一种非常有用的技术。虽然添加问号可能看起来很简单,但它能够改变正则表达式的行为,使其更加灵活和强大。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/9592