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()
メソッドを使用してください。
このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、 https://github.com/mdn/interactive-examples をクローンしてプルリクエストを送信してください。
構文
regexObj.exec(str)
引数
str
- 正規表現に一致するかどうかの対象となる文字列。
返値
一致に成功した場合、 exec()
メソッドは配列を返し (追加のプロパティ index
と input
付き、以下参照)、正規表現オブジェクトの lastIndex
プロパティを更新します。返された配列は、一致したテキストを最初の項目として持ち、その後、一致したテキストの括弧によるキャプチャグループに対して 1 つずつの項目を持ちます。
解説
次の例を想定してください。
// "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] |
もしあれば、括弧に囲まれた部分文字列が一致したものです。 括弧に囲まれた部分文字列の数に制限はありません。 |
|
||
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 リテラルでの exec() の使用
RegExp
オブジェクトを作成せずに exec()
を使用することもできます。
let matches = /(hello \S+)/.exec('This is a hello world!');
console.log(matches[1]);
これで 'hello world!' を含んだメッセージをログ出力します。
仕様書
ブラウザーの互換性
BCD tables only load in the browser