--- title: 数量詞 slug: Web/JavaScript/Guide/Regular_Expressions/Quantifiers tags: - JavaScript - Reference - Regular Expressions - quantifiers - regex translation_of: Web/JavaScript/Guide/Regular_Expressions/Quantifiers ---

{{jsSidebar("JavaScript Guide")}}{{draft}}

数量詞はマッチする文字や式の数を示します。

種類

文字 意味
x*

直前の文字 x の 0 回以上の繰り返しにマッチします。例えば /bo*/ は "A ghost booooed" の "boooo" や "A bird warbled" の "b" にマッチしますが、"A goat grunted" ではマッチしません。

x+

直前の文字 x の 1 回以上の繰り返しにマッチします。{1,} に相当します。例えば /a+/ は "candy" の "a" や "caaaaaaandy" のすべての "a" にマッチします。

x?

直前の文字 x の 0 回か 1 回の出現にマッチします。例えば /e?le?/ は "angel" の "el" や "angle" の "le"、あるいは "oslo" の "l" にマッチします。

*+?{} といった量指定子の直後に使用した場合、その量指定子をデフォルトとは逆の{{原語併記("非貪欲", "non-greedy")}} (最短)マッチにします。デフォルトは{{原語併記("欲張り", "greedy")}}(最長)マッチです。

x{n}

n には正の整数が入ります。直前の文字 x がちょうど n 回出現するものにマッチします。例えば /a{2}/ は "candy" の "a" にはマッチしませんが、"caaandy" の最初の 2 個の "a" にはマッチします。

x{n,}

n には正の整数が入ります。直前の文字 x の少なくとも n 回の出現にマッチします。例えば、/a{2,}/ は "candy" の "a" にはマッチしませんが、"caandy" や "caaaaaaandy" の "a" のすべてにマッチします。

x{n,m}

n には 0 と正の整数が、m には n より大きい正の整数が入ります。直前の文字 x が少なくとも n 回、多くても m 回出現するものにマッチします。例えば /a{1,3}/ は "cndy" ではマッチせず、"candy" の 'a'、"caandy" の 最初の 2 個の "a"、"caaaaaaandy" の最初の 3 個の "a" にマッチします。"caaaaaaandy" では元の文字列に "a" が 4 個以上ありますが、マッチするのは "aaa" であることに注意してください。

x*?
x+?
x??
x{n}?
x{n,}?
x{n,m}?

既定では *+ といった数量詞は{{原語併記("貪欲", "greedy")}} です。つまり、できる限り多くの文字列とマッチしようとします。数量詞の後にある ? 文字は{{原語併記("非貪欲", "non-greedy")}} 数量詞をつくります: つまり、マッチが見つかるとすぐに停止します。例えば、"some <foo> <bar> new </bar> </foo> thing" といった文字列が与えられたなら:

  • /<.*>/ はおそらく "<foo> <bar> new </bar> </foo>" にマッチするでしょう
  • /<.*?>/ はおそらく "<foo>" にマッチするでしょう

任意の文字

var britishText = "He asked his neighbour a favour.";
var americanText = "He asked his neighbor a favor.";

var regexpEnding = /\w+ou?r/g;
// \w+ 1つ以上の文字
// o   "o" が続く
// u?  任意で "u" が続く
// r   "r" が続く

console.table(britishText.match(regexpEnding));
// ["neighbour", "favour"]

console.table(americanText.match(regexpEnding));
// ["neighbor", "favor"]

貪欲と非貪欲の比較

var text = "I must be getting somewhere near the centre of the earth.";
var greedyRegexp = /[\w ]+/;
// [\w ]      ラテンアルファベットまたは空白
//      +     1回以上

console.log(text.match(greedyRegexp)[0]);
// "I must be getting somewhere near the centre of the earth."
// テキストのすべてがマッチ

var nonGreedyRegexp = /[\w ]+?/; // クエスチョンマークに注目
console.log(text.match(nonGreedyRegexp));
// "I"
// マッチは可能なもので最小

仕様

仕様 策定状況 コメント
{{SpecName('ESDraft', '#sec-quantifier', 'RegExp: Quantifiers')}} {{Spec2('ESDraft')}}

ブラウザサポート

{{Compat("javascript.builtins.RegExp.quantifiers")}}

関連情報