情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

ECMAScript 6の新機能(3.5)正規表現

ECMAScript 6で正規表現に新しいフラグyuが追加されました。

yフラグ

RegExp.exec

yフラグを適用したRegExpクラスのインスタンスのexec関数を呼び出した場合には下のようになります。

C:\work\node>node
> var regexp = /a/y
undefined
> regexp.lastIndex = 2
2
> var m1 = regexp.exec('paramount')
undefined
> m1
null
> regexp.lastIndex
0
> regexp.lastIndex = 3
3
> var m2 = regexp.exec('paramount')
undefined
> m2
[ 'a', index: 3, input: 'paramount' ]
> regexp.lastIndex
4

このように、RegExpクラスのインスタンスのlastIndexで表されるインデックスから正規表現のマッチを開始し、マッチしなかった場合にはlastIndex0に変更し、マッチした場合にはlastIndexをマッチの末尾の次の文字のインデックスに変更します。

RegExp.test

test関数を呼び出した場合も関数の返り値以外はexec関数と同じです。

C:\work\node>node
> var regexp = /a/y
undefined
> regexp.lastIndex = 2
2
> var m1 = regexp.test('paramount')
undefined
> m1
false
> regexp.lastIndex
0
> regexp.lastIndex = 3
3
> var m2 = regexp.test('paramount')
undefined
> m2
true
> regexp.lastIndex
4

yフラグを適用したRegExpクラスのインスタンスをString.search関数の第1引数として指定した場合には下のようになります。

C:\work\node>node
> var regexp = /a/y
undefined
> regexp.lastIndex = 1
1
> 'paramount'.search(regexp)
-1
> 'aaieba'.search(regexp)
0

このように、lastIndexの値は無視され、文字列の冒頭から正規表現のマッチを開始します

String.match

String.match関数の第1引数として指定した場合にもlastIndexの値は無視され、文字列の冒頭から正規表現のマッチを開始します

C:\work\node>node
> var regexp = /a/y
undefined
> regexp.lastIndex = 1
1
> var m1 = 'paramount'.match(regexp)
undefined
> m1
null
> var m2 = 'aaieba'.match(regexp)
undefined
> m2
[ 'a', index: 0, input: 'aaieba' ]

ただし、gフラグも同時に適用している場合には文字列の冒頭から正規表現のマッチを開始し、マッチしなくなるまで繰り返しマッチを行います。

C:\work\node>node
> var regexp = /a/gy
undefined
> regexp.lastIndex = 1
1
> var m1 = 'paramount'.match(regexp)
undefined
> m1
null
> var m2 = 'aaieba'.match(regexp)
undefined
> m2
[ 'a', 'a' ]

String.replace

String.replace関数の第1引数として指定した場合にもlastIndexの値は無視され、文字列の冒頭から正規表現のマッチを開始します

C:\work\node>node
> var regexp = /a/y
undefined
> regexp.lastIndex = 1
1
> var m1 = 'paramount'.replace(regexp, '-')
undefined
> m1
'paramount'
> var m2 = 'aaieba'.replace(regexp, '-')
undefined
> m2
'-aieba'

ただし、gフラグも同時に適用している場合には文字列の冒頭から正規表現のマッチを開始し、マッチしなくなるまで繰り返しマッチを行います。

C:\work\node>node
> var regexp = /a/gy
undefined
> regexp.lastIndex = 1
1
> var m1 = 'paramount'.replace(regexp, '-')
undefined
> m1
'paramount'
> var m2 = 'aaieba'.replace(regexp, '-')
undefined
> m2
'--ieba'

String.split

String.split関数の第1引数として指定した場合にはあまり意味のある結果にはなりません。

uフラグ

uフラグを適用すると正規表現が内部的にユニコードコードポイントで表されるようになります。

したがって、uフラグを適用した場合、サロゲートペアの一部はサロゲートペアにマッチしません

C:\work\node>node
> /\uD83D/.test('\uD83D\uDC2A')
true
> /\uD83D/u.test('\uD83D\uDC2A')
false

flags

ECMAScript 6でRegExpクラスにflagsが追加されました。

これはRegExpクラスのインスタンスに適用されている全てのフラグを返します。

> /abc/ig.flags
'gi'
> /abc/yu.flags
'uy'

RegExpクラスのコンストラクタ

ECMAScript 6でRegExpクラスのコンストラクタとして新しいものが追加されました。

下のように、第1引数にRegExpクラスのインスタンスを指定し、第2引数にフラグを指定することができるようになりました。

これにより、RegExpクラスのインスタンスのコピーを行い、別のフラグを適用することができます。

ただし、第2引数は指定しなくても構いません。指定しなかった場合には第1引数のインスタンスのフラグがそのまま適用されます。すなわち、RegExpクラスのインスタンスをそのままコピーしたものが得られます。

C:\work\node>node
> var r1 = new RegExp(/abc/ig)
undefined
> r1.flags
'gi'
> var r2 = new RegExp(r1)
undefined
> r2.flags
'gi'
> var r3 = new RegExp(r1, 'y')
undefined
> r3.flags
'y'
pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-ecmascript 2015, ecmascript 6, Javascript