From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- .../global_objects/regexp/exec/index.html | 198 +++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 files/ja/web/javascript/reference/global_objects/regexp/exec/index.html (limited to 'files/ja/web/javascript/reference/global_objects/regexp/exec/index.html') 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 new file mode 100644 index 0000000000..058f1c3cc7 --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/regexp/exec/index.html @@ -0,0 +1,198 @@ +--- +title: RegExp.prototype.exec() +slug: Web/JavaScript/Reference/Global_Objects/RegExp/exec +tags: + - JavaScript + - Method + - Prototype + - Reference + - RegExp + - Regular Expressions +translation_of: Web/JavaScript/Reference/Global_Objects/RegExp/exec +--- +
{{JSRef}}
+ +

exec() メソッドは、指定された文字列内で一致するものの検索を実行します。結果の配列、または {{jsxref("null")}} を返します。

+ +

JavaScript の {{jsxref("RegExp")}} オブジェクトは、 {{jsxref("RegExp.global", "global")}} または {{jsxref("RegExp.sticky", "sticky")}} フラグが設定されている場合 (例えば /foo/g/foo/y) はステートフルになります。これは前回の一致位置を {{jsxref("RegExp.lastIndex", "lastIndex")}} に格納します。これを内部的に使用することで、 exec() はテキストの文字列内で (キャプチャグループのある) 複数の一致を反復処理することができます。これは単なる文字列の一致を取得する {{jsxref("String.prototype.match()")}} とは対照的です。

+ +

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

+ +

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

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

構文

+ +
regexObj.exec(str)
+ +

引数

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

返値

+ +

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

+ +

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

+ +

解説

+ +

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

+ +
// "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[1] === "Brown"

+ +

result[2] === "Jumps"

+
index0 から始める一致した文字列の位置。4
input検索対象となった元の文字列。The Quick Brown Fox Jumps Over The Lazy Dog
relastIndex +

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

+
g がない場合は 0 のままです。25
ignoreCase大文字小文字を区別しない、 i フラグが指定されているかどうか。true
globalグローバルマッチのための、 g フラグが指定されているかどうか。true
multiline複数行に渡って文字列を検索する、 m フラグが指定されているかどうか。false
sourceパターンの文字列。quick\s(brown).+?(jumps)
+ +

+ +

成功する一致の検索

+ +

正規表現で "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 str = 'abbcdefabh';
+let myArray;
+while ((myArray = myRe.exec(str)) !== null) {
+  let msg = myArray[0] + ' を見つけました。';
+  msg += '次の検索は ' + myRe.lastIndex + ' からです。';
+  console.log(msg);
+}
+
+ +

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

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

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

+ +

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

+ +

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

+
+ +

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

+ +

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

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

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

+ +

仕様書

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

ブラウザーの互換性

+ +
+ + +

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

+
+ +

関連情報

+ + -- cgit v1.2.3-54-g00ecf