コンテンツにスキップ

JavaScript/RegExp/prototype/exec

出典: フリー教科書『ウィキブックス(Wikibooks)』

RegExp.prototype.exec

[編集]

概要

[編集]

RegExp.prototype.exec は、正規表現オブジェクトのメソッドで、文字列に対して正規表現パターンを適用し、最初にマッチする部分の情報を含む配列を返します。このメソッドは、マッチが見つかった場合にマッチ情報を含む配列を返し、見つからなかった場合は null を返します。

exec メソッドは、パターンと文字列を1回のマッチで確認するために使用され、主に繰り返しマッチやパターンの詳細情報を取得する際に便利です。

構文
regexp.exec(string)
引数
  • string 正規表現を適用する対象となる文字列。
戻り値
  • 正規表現が一致した場合:一致した結果を含む配列を返します。この配列の最初の要素にはマッチ全体が含まれ、続く要素にはキャプチャグループごとの一致結果が含まれます。さらに、indexinput という追加のプロパティを持っていますが、これらは列挙可能ではなく、通常は配列の一部として扱われません。
  • 一致しなかった場合: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" が含まれています。また、indexinput は列挙可能ではなく、配列のプロパティとしてアクセスできますが、配列内の要素として扱うことはできません。

Object.getOwnPropertyNames() を使ってプロパティを表示

[編集]

exec メソッドの返り値は通常の配列のように見えますが、indexinput といったプロパティは列挙できません。これらのプロパティにアクセスするために、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" に対するすべての一致を取得し、それぞれの一致のインデックスを表示します。

関連項目

[編集]