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()
メソッドを使用してください。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
このデモのソースファイルは 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