From 89642b330013f35b4ab17f7defad1340cd911621 Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Mon, 17 May 2021 00:36:23 +0900 Subject: Quantifiers を更新 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 2021/05/06 時点の英語版に同期 - 原語併記マクロを削除 --- .../regular_expressions/quantifiers/index.html | 108 ++++++++++++--------- 1 file changed, 60 insertions(+), 48 deletions(-) (limited to 'files/ja/web/javascript/guide') diff --git a/files/ja/web/javascript/guide/regular_expressions/quantifiers/index.html b/files/ja/web/javascript/guide/regular_expressions/quantifiers/index.html index 273fc82ff1..9dec2fb2f9 100644 --- a/files/ja/web/javascript/guide/regular_expressions/quantifiers/index.html +++ b/files/ja/web/javascript/guide/regular_expressions/quantifiers/index.html @@ -2,6 +2,7 @@ title: 数量詞 slug: Web/JavaScript/Guide/Regular_Expressions/Quantifiers tags: + - Guide - JavaScript - Reference - Regular Expressions @@ -9,11 +10,18 @@ tags: - regex translation_of: Web/JavaScript/Guide/Regular_Expressions/Quantifiers --- -

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

+

{{jsSidebar("JavaScript Guide")}}

-

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

+

数量詞は、一致させる文字や式の数を示します。

-

種類

+
{{EmbedInteractiveExample("pages/js/regexp-quantifiers.html", "taller")}}
+ +

種類

+ + +
+

注: 以下の表の中で、項目は単一の文字だけでなく、文字クラスUnicode プロパティエスケープグループと範囲を示すこともあります。

+
@@ -26,39 +34,39 @@ translation_of: Web/JavaScript/Guide/Regular_Expressions/Quantifiers @@ -71,28 +79,49 @@ translation_of: Web/JavaScript/Guide/Regular_Expressions/Quantifiers x{n,m}?

x* -

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

+

直前の項目 "x" の 0 回以上の繰り返しに一致します。例えば /bo*/ は "A ghost booooed" の "boooo" や "A bird warbled" の "b" に一致しますが、 "A goat grunted" には一致しません。

x+ -

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

+

直前の項目 "x" の 1 回以上の繰り返しに一致します。{1,} と同等です。例えば /a+/ は "candy" の "a" や "caaaaaaandy" のすべての "a" に一致します。

x? -

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

+

直前の項目 "x" の 0 回か 1 回の出現に一致します。例えば /e?le?/ は "angel" の "el" や "angle" の "le" に一致します。

-

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

+

*+?{} といった量指定子の直後に使用した場合、既定とは逆に、その量指定子を非貪欲 (出現回数が最小のものに一致) とします。既定は貪欲 (出現回数が最大のものに一致) です。

x{n} -

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

+

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

x{n,} -

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

+

"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" であることに注意してください。

+

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

-

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

+

既定では *+ といった数量詞は貪欲です。つまり、できる限り多くの文字列と一致しようとします。数量詞の後にある ? の文字は数量詞を非貪欲にします。つまり、一致が見つかるとすぐに停止します。例えば、"some <foo> <bar> new </bar> </foo> thing" といった文字列が与えられた場合は、

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

+

+ +

繰り返しパターン

+ +
var wordEndingWithAs = /\w+a+\b/;
+var delicateMessage = "This is Spartaaaaaaa";
+
+console.table(delicateMessage.match(wordEndingWithAs)); // [ "Spartaaaaaaa" ]
+
+ +

文字数

-

任意の文字

+
var singleLetterWord = /\b\w\b/g;
+var notSoLongWord = /\b\w{1,6}\b/g;
+var loooongWord = /\b\w{13,}\b/g;
+
+var sentence = "Why do I have to learn multiplication table?";
+
+console.table(sentence.match(singleLetterWord)); // ["I"]
+console.table(sentence.match(notSoLongWord));    // [ "Why", "do", "I", "have", "to", "learn", "table" ]
+console.table(sentence.match(loooongWord));      // ["multiplication"]
+
+ +

省略可能な文字

var britishText = "He asked his neighbour a favour.";
 var americanText = "He asked his neighbor a favor.";
 
 var regexpEnding = /\w+ou?r/g;
-// \w+ 1つ以上の文字
+// \w+ 1 つ以上の文字
 // o   "o" が続く
-// u?  任意で "u" が続く
+// u?  省略可能で "u" が続く
 // r   "r" が続く
 
 console.table(britishText.match(regexpEnding));
@@ -102,51 +131,34 @@ 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回以上
+//      +     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"
-// マッチは可能なもので最小
+// 一致する箇所は取りうる最も短い 1 文字
 
-

仕様

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

ブラウザサポート

- -
- - -

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

-
-

関連情報

-- cgit v1.2.3-54-g00ecf