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() メソッドほど一般的ではない |
分割代入 | コードをより簡潔に記述できる | 個々の変数名が必要 |
ネイミングキャプチャ | キャプチャグループに名前を付けることができ、コードがよりわかりやすくなる | 古いブラウザではサポートされていない場合がある |