From b679442304ecb8fe61ec7987cffca69d9d46b96d Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Sun, 6 Jun 2021 00:11:15 +0900 Subject: RegExp.prototype.exec() の記事を更新 (#982) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 記述ミスにより発生した過剰な \ を削除 - 2021/05/05 時点の英語版に同期 --- .../global_objects/regexp/exec/index.html | 236 ++++++++++++--------- 1 file changed, 136 insertions(+), 100 deletions(-) (limited to 'files/ja/web/javascript') diff --git a/files/ja/web/javascript/reference/global_objects/regexp/exec/index.html b/files/ja/web/javascript/reference/global_objects/regexp/exec/index.html index 058f1c3cc7..dea5114a7f 100644 --- a/files/ja/web/javascript/reference/global_objects/regexp/exec/index.html +++ b/files/ja/web/javascript/reference/global_objects/regexp/exec/index.html @@ -2,12 +2,13 @@ title: RegExp.prototype.exec() slug: Web/JavaScript/Reference/Global_Objects/RegExp/exec tags: - - JavaScript - - Method - - Prototype - - Reference - - RegExp - - Regular Expressions +- JavaScript +- Method +- Prototype +- Reference +- RegExp +- Regular Expressions +browser-compat: javascript.builtins.RegExp.exec translation_of: Web/JavaScript/Reference/Global_Objects/RegExp/exec ---
{{JSRef}}
@@ -18,103 +19,140 @@ translation_of: Web/JavaScript/Reference/Global_Objects/RegExp/exec

より新しい関数として、 (キャプチャグループによる) 複数の部分の文字列の一致を単純化する {{jsxref("String.prototype.matchAll()")}} が提案されています。

-

単に見つかったか見つからなかったかを true または false で知るために検索を実行するのであれば、 {{jsxref("RegExp.prototype.test()")}} メソッドまたは {{jsxref("String.prototype.search()")}} メソッドを使用してください。

+

truefalse かを知るために検索を実行するのであれば、 {{jsxref("RegExp.prototype.test()")}} メソッドを使用してください。

-
{{EmbedInteractiveExample("pages/js/regexp-prototype-exec.html")}}
+

文字列中での位置を知るために検索を実行するのであれば、 {{jsxref("String.prototype.search()")}} メソッドを使用してください。

- +
{{EmbedInteractiveExample("pages/js/regexp-prototype-exec.html")}}
-

構文

+

構文

-
regexObj.exec(str)
+
exec(str)
-

引数

+

引数

str
-
正規表現に一致するかどうかの対象となる文字列。
+
正規表現の検索の対象となる文字列。
-

返値

+

返値

-

一致に成功した場合、 exec() メソッドは配列を返し (追加のプロパティ indexinput 付き、以下参照)、正規表現オブジェクトの {{jsxref("RegExp.lastIndex", "lastIndex")}} プロパティを更新します。返された配列は、一致したテキストを最初の項目として持ち、その後、一致したテキストの括弧によるキャプチャグループに対して 1 つずつの項目を持ちます。

+

検索に成功した場合、 exec() メソッドは配列を返し (追加のプロパティ indexinput が付いており、 d フラグが設定されている場合は indices も、以下参照)、正規表現オブジェクトの {{jsxref("RegExp.lastIndex", "lastIndex")}} プロパティを更新します。返された配列は、一致したテキストを最初の項目として持ち、その後、一致したテキストの括弧によるキャプチャグループに対して 1 つずつの項目を持ちます。

一致に失敗した場合は、 exec() メソッドは {{jsxref("null")}} を返し、 {{jsxref("RegExp.lastIndex", "lastIndex")}} を 0 に設定します。

-

解説

+

解説

次の例を想定してください。

-
// "quick brown" の後に "jumps" が来るものを、その間の文字を無視して一致させます。
+
// "quick brown" の後に "jumps" が来るものを、その間の文字を無視して一致させます。
 // "brown" と "jumps" を取得します。
 // 大文字と小文字は区別しません。
 let re = /quick\s(brown).+?(jumps)/ig;
 let result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
 
-

このスクリプトの結果は以下の表の通りです。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - +
オブジェクトプロパティ/添字説明
result[0]文字が一致した部分の文字列全体"Quick Brown Fox Jumps"
[1], ...[n] -

もしあれば、括弧に囲まれた部分文字列が一致したものです。

+

以下の表は、このスクリプト実行後の result の状態を示しています。

-

括弧に囲まれた部分文字列の数に制限はありません。

-
-

result[1] === "Brown"

- -

result[2] === "Jumps"

-
index0 から始める一致した文字列の位置。4
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + +
プロパティ/添字説明
[0]文字が一致した部分の文字列全体"Quick Brown Fox Jumps"
[1], ...[n] +

もしあれば、括弧に囲まれた部分文字列が一致したものです。

+ +

括弧に囲まれた部分文字列の数に制限はありません。

+
+

result[1] === "Brown"

+ +

result[2] === "Jumps"

+
index0 から始める一致した文字列の位置。4
indices各項目が部分文字列の一致を表す配列です。各部分文字列の一致自体は、最初の項目が開始位置、 2 番目の項目が終了位置を表す配列です。 indices 配列にはさらに、名前の付いたすべてのキャプチャリンググループのオブジェクトを保持する groups プロパティがあります。キーはキャプチャリンググループの名前で、各値は、最初の項目が開始項目、 2 番目の項目がキャプチャリンググループの終了位置となる配列です。正規表現にキャプチャリンググループが含まれていなかった場合は、 groupsundefined です。 + +

indices[0] === Array [ 4, 25 ]

+

indices[1] === Array [ 10, 15 ]

+

indices[2] === Array [ 20, 25 ]

+

indices.groups === undefined

+

indices.length === 3

+
input 検索対象となった元の文字列。 The Quick Brown Fox Jumps Over The Lazy Dog
relastIndex -

次回の検索を始める位置です。

-
g がない場合は 0 のままです。25
+ +

以下の表は、このスクリプト実行後の re の状態を示しています。

+ + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -122,18 +160,31 @@ let result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog'); - + + + + + + + + + + +
プロパティ/添字説明
lastIndex +

次回の検索を始める位置です。

+ +

g がない場合は 0 のままです。

+
25
dotAll + s フラグが使用され、 . が改行文字に一致するようにしたかどうかを示します。 + false
hasIndices + d フラグが使用され、返値に一致する部分文字列の開始位置と終了位置を持つ indices プロパティを生成したかどうかを示します。true
ignoreCase大文字小文字を区別しない、 i フラグが指定されているかどうか。i フラグが使用され、大文字小文字を区別しなかったかどうか。 true
globalグローバルマッチのための、 g フラグが指定されているかどうか。g フラグが使用され、グローバル検索が行われたかどうか。 true
multiline複数行に渡って文字列を検索する、 m フラグが指定されているかどうか。 m フラグが使用され、複数行に渡って文字列が検索されたかどうか。 false
パターンの文字列。 quick\s(brown).+?(jumps)
sticky + y フラグが使用され、比較が lastIndex プロパティで示された位置からのみ行われたかどうか。 + false
unicodeu フラグが使用され、パターンが Unicode コードポイントの並びとして扱われたかどうか。 + false
-

+

-

成功する一致の検索

+

成功する一致の検索

正規表現で "g" フラグを使用する場合、同じ文字列で成功する一致を見つけるために exec() メソッドを複数回使うことができます。その際、検索は正規表現オブジェクトの {{jsxref("RegExp.lastIndex", "lastIndex")}} プロパティで指定された位置の str の部分文字列から始まります ({{jsxref("RegExp.prototype.test()", "test()")}} も {{jsxref("RegExp.lastIndex", "lastIndex")}} プロパティの位置から始めます)。なお、別な文字列を検索する場合でも {{jsxref("RegExp.lastIndex", "lastIndex")}} プロパティはリセットされず、既存の {{jsxref("RegExp.lastIndex", "lastIndex")}} から検索を始めます。

例えば、次のスクリプトを考えてみてください。

-
let myRe = /ab*/g;
+
let myRe = /ab*/g;
 let str = 'abbcdefabh';
 let myArray;
 while ((myArray = myRe.exec(str)) !== null) {
@@ -145,54 +196,39 @@ while ((myArray = myRe.exec(str)) !== null) {
 
 

このスクリプトは以下のテキストを表示します。

-
abb を見つけました。次の検索は 3 からです。
+
abb を見つけました。次の検索は 3 からです。
 ab を見つけました。次の検索は 9 からです。
 

警告: 正規表現リテラル (または {{jsxref("RegExp")}} コンストラクター) を while の条件の中に配置しないでください。

-

{{jsxref("RegExp.lastIndex", "lastIndex")}} プロパティが繰り返し毎にリセットされるので、無限ループになります。

+

{{jsxref("RegExp.lastIndex", "lastIndex")}} プロパティが繰り返し毎にリセットされるので、無限ループになります。

-

また、グローバルフラグ ("g") が設定されていることを確認してください。これも無限ループを引き起こします。

+

また、グローバルフラグ ("g") が設定されていることを確認してください。これも無限ループを引き起こします。

-

RegExp リテラルでの exec() の使用

+

RegExp リテラルでの exec() の使用

-

{{jsxref("RegExp")}} オブジェクトを作成せずに exec() を使用することもできます。

+

{{jsxref("RegExp")}} オブジェクトを作成せずに exec() を使用することもできます。

-
let matches = /(hello \S+)/.exec('This is a hello world!');
+
let matches = /(hello \S+)/.exec('This is a hello world!');
 console.log(matches[1]);
-
+
-

これで 'hello world!' を含んだメッセージをログ出力します。

+

これで 'hello world!' を含んだメッセージをログ出力します。

-

仕様書

+

仕様書

- - - - - - - - - - - -
仕様書
{{SpecName('ESDraft', '#sec-regexp.prototype.exec', 'RegExp.exec')}}
- -

ブラウザーの互換性

+{{Specifications}} -
- +

ブラウザーの互換性

-

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

-
+

{{Compat}}

-

関連情報

+

関連情報

-- cgit v1.2.3-54-g00ecf