Perlの名前付き後方参照
Perl には名前付き後方参照がありますが、2017/08/09現在のECMAScriptでは仕様化されていません。
2017/08/09現在のJavaScriptコード
現在のJavaScriptでは String#replace
のコールバック関数を使って書くのが限界です。
JavaScript
1'use strict';
2function parseDateString1 (dateString) {
3 return dateString.replace(/(\d{4})-(\d{2})-(\d{2})|(\d{2})\/(\d{2})\/(\d{4})|(\d{2})\.(\d{2})\.(\d{4})/g, function (string, y1, m1, d1, m2, d2, y2, d3, m3, y3) {
4 if (y1) {
5 return 'day=' + d1 + ' month=' + m1 + ' year=' + y1;
6 }
7
8 if (y2) {
9 return 'day=' + d2 + ' month=' + m2 + ' year=' + y2;
10 }
11
12 if (y3) {
13 return 'day=' + d3 + ' month=' + m3 + ' year=' + y3;
14 }
15
16 throw new Error('Unexpected exception');
17 });
18}
19
20console.log(parseDateString1('2006-10-21 15.01.2007 10/31/2005')); // "day=21 month=10 year=2006 day=15 month=01 year=2007 day=31 month=10 year=2005"
Perl互換の正規表現が使える場合のJavaScriptコード
もし、JavaScriptでPerl互換正規表現が使えるならば、下記のように書けます。
JavaScript
1function parseDateString2 (dateString) {
2 return dateString.replace(/(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})|(?<m>\d{2})\/(?<d>\d{2})\/(?<y>\d{4})|(?<d>\d{2})\.(?<m>\d{2})\.(?<y>\d{4})/g, 'day=$+{d} month=$+{m} year=$+{y}');
3}
4
5console.log(parseDateString2('2006-10-21 15.01.2007 10/31/2005')); // "day=21 month=10 year=2006 day=15 month=01 year=2007 day=31 month=10 year=2005"
Perlの名前付き後方参照は一番初めにマッチした名前付き参照を参照してくれます。
素晴らしいですね!
Re: te2ji さん