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

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨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}?

引數

原子

單個原子

計數

一個非負整數。原子應重複的次數。

min

一個非負整數。原子可以重複的最小次數。

max 可選

一個非負整數。原子可以重複的最大次數。如果省略,原子可以重複任意多次。

描述

量詞放在原子之後,使其重複特定次數。它不能單獨出現。每個量詞都能夠指定模式必須重複的最小和最大次數。

量詞 最小 最大
? 0 1
* 0 Infinity
+ 1 Infinity
{count} 計數 計數
{min,} min Infinity
{min,max} min 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 清理器,例如 HTML 清理器 API

定位 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® 2026 語言規範
# prod-Quantifier

瀏覽器相容性

另見