正则表达式是处理文本的强大工具,但默认情况下它们会尽可能匹配尽可能多的字符,这被称为“贪婪匹配”。有时候,我们需要让正则表达式以“非贪婪”的方式匹配,以便我们能够得到我们想要的结果。在本文中,我将介绍如何通过添加一个问号来使正则表达式变成非贪婪。
贪婪匹配和非贪婪匹配
在正则表达式中,量词(如 *、+、?、{n} 和 {n,m})用于指示前面的模式应该重复多少次。默认情况下,量词是贪婪的,意味着它们将尽可能多地匹配文本。
例如,考虑以下字符串:
<p>Hello, <strong>world</strong>!</p>
如果使用贪婪匹配的正则表达式 /<.*>/
,它将匹配整个字符串 <p>Hello, <strong>world</strong>!</p>
,而不仅仅是 <p>
和 </p>
之间的部分。这是因为 .*
匹配了任何字符和任何数量的字符,包括 <strong>
和 </strong>
标签。
相反,非贪婪匹配将尽可能少地匹配文本。要使正则表达式变成非贪婪的,我们可以在量词后面添加一个问号。
例如,使用非贪婪匹配的正则表达式 /<.*?>\w*<\/.*?>/
将仅匹配 <strong>world</strong>
,而不是整个字符串。这是因为 .*?
仅匹配任意字符的最小可能数量,直到它与 \w*
匹配为止,然后再匹配 </.*?>
。
示例代码
以下是一个 JavaScript 示例,它演示了如何使用非贪婪匹配寻找 HTML 标签中的文本:
const html = '<p>Hello, <strong>world</strong>!</p>'; const regex = /<.*?>\w*<\/.*?>/g; const matches = html.match(regex); console.log(matches); // ["<strong>world</strong>"]
在上面的代码中,我们使用非贪婪匹配的正则表达式 /\<.*?\>\w*\<\/.*?\>/g
来搜索 HTML 字符串中的文本。由于我们使用了全局标志 g
,因此会匹配多次。然后,我们将所有匹配项存储在数组 matches
中,并将其打印到控制台上。
结论
通过使用非贪婪匹配,我们可以轻松地让正则表达式只匹配我们需要的部分。在处理文本时,这是一种非常有用的技术。虽然添加问号可能看起来很简单,但它能够改变正则表达式的行为,使其更加灵活和强大。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/9592