JS.next

JavaScriptの最新実装情報を追うブログ

正規表現の名前付きキャプチャが実装された

概要

正規表現内の好きな部分に名前を付け、その名前を使ってマッチ結果を参照できるようになった。


共通

あるパターン「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を付ける必要がある)


マッチについて

正規表現オブジェクトのmatchexecメソッドを呼ぶと、返り値のオブジェクトの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