JavaScript/RegExp/prototype/exec
RegExp.prototype.exec
[編集]概要
[編集]RegExp.prototype.exec
は、正規表現オブジェクトのメソッドで、文字列に対して正規表現パターンを適用し、最初にマッチする部分の情報を含む配列を返します。このメソッドは、マッチが見つかった場合にマッチ情報を含む配列を返し、見つからなかった場合は null
を返します。
exec
メソッドは、パターンと文字列を1回のマッチで確認するために使用され、主に繰り返しマッチやパターンの詳細情報を取得する際に便利です。
- 構文
regexp.exec(string)
- 引数
-
string
正規表現を適用する対象となる文字列。
- 戻り値
-
- 正規表現が一致した場合:一致した結果を含む配列を返します。この配列の最初の要素にはマッチ全体が含まれ、続く要素にはキャプチャグループごとの一致結果が含まれます。さらに、
index
とinput
という追加のプロパティを持っていますが、これらは列挙可能ではなく、通常は配列の一部として扱われません。 - 一致しなかった場合:
null
を返します。
- 正規表現が一致した場合:一致した結果を含む配列を返します。この配列の最初の要素にはマッチ全体が含まれ、続く要素にはキャプチャグループごとの一致結果が含まれます。さらに、
返される配列の構造
[編集]exec
が一致を見つけた場合、返される配列は以下のようになります:
- 0番目の要素には全体の一致が含まれます。
- 1番目以降の要素にはキャプチャグループごとの一致が含まれます。
- 配列には以下のプロパティも含まれます(列挙可能):
index
: 一致が見つかった位置のインデックス(文字列内での位置)。input
:exec
メソッドに渡された元の文字列。groups
: 名前付きキャプチャグループがある場合、その一致結果を含みます。
例えば、次のコード例を見てみましょう。
const regex = /(\d+)\s(\w+)/; const str = "123 abc"; const result = regex.exec(str); console.log(result); // 出力例: [ '123 abc', '123', 'abc', index: 0, input: '123 abc' ]
この場合、exec
は一致した文字列 "123 abc"
を返し、キャプチャグループには "123"
と "abc"
が含まれています。また、index
と input
は列挙可能ではなく、配列のプロパティとしてアクセスできますが、配列内の要素として扱うことはできません。
Object.getOwnPropertyNames()
を使ってプロパティを表示
[編集]exec
メソッドの返り値は通常の配列のように見えますが、index
と input
といったプロパティは列挙できません。これらのプロパティにアクセスするために、Object.getOwnPropertyNames()
を使って返り値のプロパティを確認する方法を以下に示します。
const regex = /(\d+)\s(\w+)/; const str = "123 abc"; const result = regex.exec(str); console.log(result); // 返り値の配列を表示 console.log(Object.getOwnPropertyNames(result)); // プロパティ名を列挙
このコードを実行すると、以下のような出力が得られます:
[ '123 abc', '123', 'abc', index: 0, input: '123 abc' ] [ '0', '1', '2', 'length', 'index', 'input', 'groups' ]
ここで、Object.getOwnPropertyNames(result)
を使うと、result
配列のプロパティとして 0
, 1
, 2
のようなキャプチャグループに対応するインデックスの他に、index
, input
, groups
のプロパティが表示されます。
特徴
[編集]exec
メソッドは、正規表現がグローバルフラグ (g
フラグ) を持っている場合、前回の検索の続きから検索を開始します。このため、グローバルフラグを使った場合は、呼び出しごとに異なる結果が返されることがあります。exec
メソッドは、結果が見つかるたびに繰り返し呼び出すことで、文字列中のすべての一致を取得できます。
例
[編集]const regex = /a(b)c/g; const str = "abc abc abc"; let match; while ((match = regex.exec(str)) !== null) { console.log(<code>一致: ${match[0]}, インデックス: ${match.index}</code>); } // 出力例: // 一致: abc, インデックス: 0 // 一致: abc, インデックス: 4 // 一致: abc, インデックス: 8
上記の例では、exec
メソッドがグローバルフラグ (g
) を使用しているため、文字列 "abc abc abc"
に対するすべての一致を取得し、それぞれの一致のインデックスを表示します。