语法
// Greedy
atom?
atom*
atom+
atom{count}
atom{min,}
atom{min,max}
// Non-greedy
atom??
atom*?
atom+?
atom{count}?
atom{min,}?
atom{min,max}?
参数
描述
量词放在原子之后,使其重复特定次数。它不能单独出现。每个量词都能够指定模式必须重复的最小和最大次数。
| 量词 | 最小 | 最大 |
|---|---|---|
? |
0 | 1 |
* |
0 | Infinity |
+ |
1 | Infinity |
{count} |
计数 |
计数 |
{min,} |
min |
Infinity |
{min,max} |
min |
max |
对于 {count}、{min,} 和 {min,max} 语法,数字周围不能有空格,否则它会变成一个字面量模式。
const re = /a{1, 3}/;
re.test("aa"); // false
re.test("a{1, 3}"); // true
此行为在Unicode 感知模式中已修复,其中花括号不能在不转义的情况下以字面量形式出现。在不转义的情况下使用 { 和 } 字面量是一种用于 Web 兼容性的废弃语法,不应依赖它。
/a{1, 3}/u; // SyntaxError: Invalid regular expression: Incomplete quantifier
如果最小值大于最大值,则会发生语法错误。
/a{3,2}/; // SyntaxError: Invalid regular expression: numbers out of order in {} quantifier
量词可能导致捕获组多次匹配。有关此情况下的行为的更多信息,请参阅捕获组页面。
每次重复匹配不必是相同的字符串。
/[ab]*/.exec("aba"); // ['aba']
量词默认是贪婪的,这意味着它们会尝试尽可能多地匹配,直到达到最大值,或者直到无法进一步匹配。您可以通过在量词后面添加一个 ? 使其成为非贪婪的。在这种情况下,量词会尝试尽可能少地匹配,只有当无法通过这些重复次数匹配模式的其余部分时,才会匹配更多次。
/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
但是,一旦正则表达式在某个索引处成功匹配字符串,它将不会尝试后续索引,即使这可能导致消耗的字符更少。
/a*?$/.exec("aaa"); // ['aaa']; the match already succeeds at the first character, so the regex never attempts to start matching at the second character
如果无法匹配模式的其余部分,贪婪量词可能会尝试较少的重复次数。
/[ab]+[abc]c/.exec("abbc"); // ['abbc']
在此示例中,[ab]+ 首先贪婪地匹配 "abb",但 [abc]c 无法匹配模式的其余部分 ("c"),因此量词被缩减为仅匹配 "ab"。
贪婪量词避免匹配无限多的空字符串。如果已达到最小匹配次数并且原子在此位置没有消耗更多字符,则量词停止匹配。这就是为什么 /(a*)*/.exec("b") 不会导致无限循环。
贪婪量词尝试尽可能多地匹配次数;它不会最大化匹配的长度。例如,/(aa|aabaac|ba)*/.exec("aabaac") 匹配 "aa",然后匹配 "ba",而不是 "aabaac"。
量词应用于单个原子。如果要量化更长的模式或析取,则必须对其进行分组。量词不能应用于断言。
/^*/; // SyntaxError: Invalid regular expression: nothing to repeat
在Unicode 感知模式中,先行断言可以量化。这是一种用于 Web 兼容性的废弃语法,不应依赖它。
/(?=a)?b/.test("b"); // true; the lookahead is matched 0 time
示例
移除 HTML 标签
以下示例移除用尖括号括起来的 HTML 标签。请注意使用 ? 以避免一次消耗太多字符。
function stripTags(str) {
return str.replace(/<.+?>/g, "");
}
stripTags("<p><em>lorem</em> <strong>ipsum</strong></p>"); // 'lorem ipsum'
通过贪婪匹配也可以达到相同的效果,但不允许重复模式匹配 >。
function stripTags(str) {
return str.replace(/<[^>]+>/g, "");
}
stripTags("<p><em>lorem</em> <strong>ipsum</strong></p>"); // 'lorem ipsum'
警告:这仅用于演示,它不处理属性值中的 >。请改用适当的 HTML 清理器,例如 HTML 清理器 API。
定位 Markdown 段落
在 Markdown 中,段落由一个或多个空行分隔。以下示例通过匹配两个或更多换行符来计算字符串中的所有段落。
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® 2026 语言规范 # prod-Quantifier |
浏览器兼容性
加载中…