RegExp.prototype.exec()

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

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

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

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

構文

regexObj.exec(str)

引数

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

返値

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

一致に失敗した場合は、 exec() メソッドは null を返し、 lastIndex0 に設定します。

解説

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

// "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"

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

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

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

成功する一致の検索

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

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

lastIndex プロパティが繰り返し毎にリセットされるので、無限ループになります。

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

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

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

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

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

仕様書

仕様書
ECMAScript (ECMA-262)
RegExp.exec の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
execChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 5Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 0.1.100

凡例

完全対応  
完全対応

関連情報