量词:*, +, ?, {n}, {n,}, {n,m}

基线 广泛可用

此功能已建立,并在许多设备和浏览器版本中运行。它自 2015 年 7 月.

一个 **量词** 将重复一个 原子 一定次数。量词放在它所应用的原子之后。

语法

正则表达式
// Greedy
atom?
atom*
atom+
atom{count}
atom{min,}
atom{min,max}

// Non-greedy
atom??
atom*?
atom+?
atom{count}?
atom{min,}?
atom{min,max}?

参数

原子

单个 原子

计数

非负整数。原子应该重复的次数。

最小值

非负整数。原子可以重复的最小次数。

max 可选

非负整数。原子可以重复的最大次数。如果省略,原子可以根据需要重复多次。

描述

量词放在一个 原子 之后,以将其重复一定次数。它不能单独出现。每个量词都可以指定模式必须重复的最小和最大次数。

量词 最小值 最大值
? 0 1
* 0 Infinity
+ 1 Infinity
{count} 计数 计数
{min,} 最小值 Infinity
{min,max} 最小值 max

对于 {count}{min,}{min,max} 语法,数字周围不能有空格 - 否则,它将成为一个 字面量 模式。

js
const re = /a{1, 3}/;
re.test("aa"); // false
re.test("a{1, 3}"); // true

此行为在 Unicode 识别模式 中得到修复,其中大括号不能在没有 转义 的情况下直接出现。在没有转义的情况下直接使用 {} 的能力是 用于 Web 兼容性的已弃用语法,你不应该依赖它。

js
/a{1, 3}/u; // SyntaxError: Invalid regular expression: Incomplete quantifier

如果最小值大于最大值,则为语法错误。

js
/a{3,2}/; // SyntaxError: Invalid regular expression: numbers out of order in {} quantifier

量词会导致 捕获组 多次匹配。有关此情况下的行为的更多信息,请参阅捕获组页面。

每次重复匹配不必是相同的字符串。

js
/[ab]*/.exec("aba"); // ['aba']

量词默认情况下是 *贪婪* 的,这意味着它们会尽可能多地尝试匹配,直到达到最大值,或者直到无法再匹配为止。你可以在量词后面添加一个 ? 来使其 *非贪婪*。在这种情况下,量词将尝试尽可能少地匹配,只有在无法使用此次数重复匹配剩余模式时,才会匹配更多次数。

js
/a*/.exec("aaa"); // ['aaa']; the entire input is consumed
/a*?/.exec("aaa"); // ['']; it's possible to consume no characters and still match successfully
/^a*?$/.exec("aaa"); // ['aaa']; it's not possible to consume fewer characters and still match successfully

但是,一旦正则表达式在某个索引处成功匹配字符串,它就不会尝试后续索引,尽管这可能会导致消耗更少的字符。

js
/a*?$/.exec("aaa"); // ['aaa']; the match already succeeds at the first character, so the regex never attempts to start matching at the second character

如果无法以其他方式匹配剩余模式,贪婪量词可能会尝试更少的重复。

js
/[ab]+[abc]c/.exec("abbc"); // ['abbc']

在此示例中,[ab]+ 首先贪婪地匹配 "abb",但 [abc]c 无法匹配剩余模式 ("c"),因此量词减少为仅匹配 "ab"

贪婪量词避免匹配无限多个空字符串。如果达到最小匹配次数,并且原子在这个位置不再消耗任何字符,则量词停止匹配。这就是为什么 /(a*)*/.exec("b") 不会导致无限循环。

贪婪量词试图尽可能多地匹配 *次数*;它不会最大化匹配的 *长度*。例如,/(aa|aabaac|ba)*/.exec("aabaac") 匹配 "aa",然后匹配 "ba",而不是 "aabaac"

量词适用于单个原子。如果你想量化更长的模式或析取,则必须对其进行 分组。量词不能应用于 断言

js
/^*/; // SyntaxError: Invalid regular expression: nothing to repeat

Unicode 识别模式 中,先行断言 可以被量化。这是一个 用于 Web 兼容性的已弃用语法,你不应该依赖它。

js
/(?=a)?b/.test("b"); // true; the lookahead is matched 0 time

示例

删除 HTML 标签

以下示例删除括在尖括号中的 HTML 标签。请注意 ? 的使用,以避免一次消耗太多字符。

js
function stripTags(str) {
  return str.replace(/<.+?>/g, "");
}

stripTags("<p><em>lorem</em> <strong>ipsum</strong></p>"); // 'lorem ipsum'

可以使用贪婪匹配来实现相同的效果,但不能允许重复模式匹配 >

js
function stripTags(str) {
  return str.replace(/<[^>]+>/g, "");
}

stripTags("<p><em>lorem</em> <strong>ipsum</strong></p>"); // 'lorem ipsum'

警告: 这仅用于演示 - 它无法处理属性值中的 >。请使用适当的 HTML 净化器。

定位 Markdown 段落

在 Markdown 中,段落由一个或多个空行分隔。以下示例通过匹配两个或多个换行符来计算字符串中的所有段落。

js
function countParagraphs(str) {
  return str.match(/(?:\r?\n){2,}/g).length + 1;
}

countParagraphs(`
Paragraph 1

Paragraph 2
Containing some line breaks, but still the same paragraph

Another paragraph
`); // 3

警告: 这仅用于演示 - 它无法处理代码块或其他 Markdown 块元素(如标题)中的换行符。请使用适当的 Markdown 解析器。

规范

规范
ECMAScript 语言规范
# prod-Quantifier

浏览器兼容性

BCD 表仅在浏览器中加载

另请参阅