正規表現の名前付きキャプチャが実装された
概要
正規表現内の好きな部分に名前を付け、その名前を使ってマッチ結果を参照できるようになった。
共通
あるパターン「pattern」に名前「name」を付けたい時は(?<name>pattern)
と記述する。
例:日付文字列にマッチする正規表現の、「年」「月」「日」の部分にそれぞれ「year」「month」「day」という名前を付ける
// ES2018以降 re2018 = /(?<year>\d{4})年(?<month>\d{1,2})月(?<day>\d{1,2})日/u // ES2017以前 re2017 = /(\d{4})年(\d{1,2})月(\d{1,2})日/
(※名前付きキャプチャを使うには正規表現にユニコードフラグ/regexp/u
を付ける必要がある)
マッチについて
正規表現オブジェクトのmatch
やexec
メソッドを呼ぶと、返り値のオブジェクトのgroups
プロパティにはあるオブジェクトが入る。
そのオブジェクトは全ての名前とそれに紐づくパターンにマッチした文字列からなるプロパティを持つことになる。
例:日付文字列から「月」を取り出す
// ES2018以降 '2018年9月1日'.match( re2018 ).groups.month // "9" // ES2017以前 '2017年9月1日'.match( re2017 )[ 2 ] // "9"
置換について
replace
メソッドの第二引数に指定する文字列で$<name>
と記述すると、
「name」に紐づくパターンにマッチした文字列がそこに置き換えられる。
例:日本語日付文字列をアメリカ式に置換する
// ES2018以降 '2018年9月1日'.replace( re2018, '$<month>/$<day>/$<year>' ) // "9/1/2018" // ES2017以前 '2017年9月1日'.replace( re2017, '$2/$3/$1' ) // "9/1/2017"
後方参照について
正規表現中に\k<name>
を使うと、その部分以前に「name」と紐づくパターンにマッチした文字列と、全く同じ文字列にマッチさせることができる。
例:同じ数字が3つ連続で現れる部分にマッチする
// ES2018以降 obj2018 = '12345556789'.match( /(?<num>\d)\k<num>{2}/u ) obj2018.groups.num // "5" obj2018[ 0 ] // "555" // ES2017以前 obj2017 = '12345556789'.match( /(\d)\1{2}/ ) obj2017[ 1 ] // "5" obj2017[ 0 ] // "555"
実装されるバージョン
V8 5.3.231