JavaScriptのRegExp.lastParenプロパティとは?使い方は?


RegExp.lastParen プロパティは、正規表現オブジェクトの最後のマッチしたグループ内の部分文字列を表します。これは、RegExp オブジェクトの静的プロパティであり、特定のオブジェクトに関連付けられていません。つまり、どの正規表現オブジェクトが使用されたかに関係なく、常に最新のマッチングされたグループ内の部分文字列を返します。

構文

RegExp.lastParen;

次の例では、RegExp.lastParen プロパティを使用して、電話番号の最後のグループ内の部分文字列 (拡張子) を取得する方法を示します。

const regex = /(\d{3})-(\d{3})-(\d{4})$/;
const phoneNumber = "123-456-7890";

const match = phoneNumber.match(regex);

if (match) {
  console.log(RegExp.lastParen); // 7890
}

注意事項

RegExp.lastParen プロパティは、非推奨であり、将来のバージョンで削除される可能性があります。代わりに、RegExp オブジェクトの exec() メソッドを使用して、個々のグループ内の部分文字列を取得することをお勧めします。

const regex = /(\d{3})-(\d{3})-(\d{4})$/;
const phoneNumber = "123-456-7890";

const match = regex.exec(phoneNumber);

if (match) {
  console.log(match[3]); // 7890
}


const regex = /a(b)?c/;
const text = "abc";

console.log(RegExp.lastParen); // "b"

// 次の行はエラーになります
console.log(regex.lastParen); // TypeError: Cannot read property 'lastParen' of undefined

この例では、regex 正規表現は "a" に続くオプションの "b" と "c" をマッチさせます。最初の行は RegExp.lastParen を使用して最後のマッチしたグループ内の部分文字列を取得し、"b" を返します。

しかし、2行目は regex オブジェクトを使用して lastParen プロパティにアクセスしようとします。これはエラーになります。lastParen は静的プロパティであり、常に RegExp コンストラクタを使用して直接アクセスする必要があります。

推奨されるコード

const regex = /a(b)?c/;
const text = "abc";

const match = regex.exec(text);

if (match) {
  console.log(match[1]); // "b" または undefined
}

上記のコードは、exec() メソッドを使用して正規表現を照合し、マッチング結果を match 配列に格納します。match[1] は最初のキャプチャグループ内の部分文字列を表し、"b" またはマッチングがない場合は undefined になります。

この方法は、RegExp.lastParen を使用するよりも明確で、エラーが発生しにくいです。

  • マルチラインフラグ (m) が設定されている場合、RegExp.lastParen は最後の行の最後のマッチングされたグループ内の部分文字列のみを返します。
  • RegExp.lastParen は、グローバルフラグ (g) が設定されていない正規表現でのみ機能します。


exec() メソッドを使用する

これは最も一般的で推奨される方法です。exec() メソッドは、正規表現を照合し、結果を配列として返します。配列の最初の要素は、一致した全体を表し、その後の要素はそれぞれキャプチャグループ内の部分文字列を表します。

const regex = /(\d{3})-(\d{3})-(\d{4})$/;
const phoneNumber = "123-456-7890";

const match = regex.exec(phoneNumber);

if (match) {
  console.log(match[1]); // 123
  console.log(match[2]); // 456
  console.log(match[3]); // 7890
}

groups プロパティを使用する

groups プロパティは、exec() メソッドによって返される配列と同じ内容を持つオブジェクトです。ただし、groups プロパティはキーと値のペアで構成されており、キーはキャプチャグループの名前、値は部分文字列を表します。

const regex = /(?<name>\w+)-(?<age>\d+)/;
const person = "John-30";

const match = regex.exec(person);

if (match) {
  console.log(match.groups.name); // John
  console.log(match.groups.age); // 30
}

分割代入を使用する

分割代入を使用して、exec() メソッドの結果を個々の変数に直接割り当てることができます。

const regex = /(\d{3})-(\d{3})-(\d{4})$/;
const phoneNumber = "123-456-7890";

const [_, areaCode, localNumber, extension] = regex.exec(phoneNumber);

console.log(areaCode); // 123
console.log(localNumber); // 456
console.log(extension); // 7890

ネイミングキャプチャを使用する

ネイミングキャプチャを使用すると、キャプチャグループに名前を付けることができ、その名前を使用して部分文字列にアクセスできます。

const regex = /(?<name>\w+)-(?<age>\d+)/;
const person = "John-30";

const match = regex.exec(person);

console.log(match.groups.name); // John
console.log(match.groups.age); // 30

RegExp.lastParen プロパティは非推奨であり、将来のバージョンで削除される可能性があります。代わりに、上記のいずれかの方法を使用して、正規表現オブジェクトの最後のマッチングされた部分文字列を取得することをお勧めします。

各方法の長所と短所を比較すると、次のようになります。

方法長所短所
exec() メソッド最も一般的で推奨される方法、柔軟性が高いやや冗長
groups プロパティキーと値のペアで結果を格納するため、よりわかりやすいexec() メソッドほど一般的ではない
分割代入コードをより簡潔に記述できる個々の変数名が必要
ネイミングキャプチャキャプチャグループに名前を付けることができ、コードがよりわかりやすくなる古いブラウザではサポートされていない場合がある