正規表現
正規表現は文字パターンを表す記法で、JavaScriptでは/foo/
やnew RegExp("foo")
のようにして正規表現を表すオブジェクトを生成できます。
正規表現で使用される文字クラス・フラグについて簡単にまとめてみます。
文字クラス
[abc]
のように[]
で囲むことで宣言できます。
この例ではa
またはb
またはc
にマッチします。
-
を使用すると範囲指定ができます。
[1-9]
は1
から9
を、[a-z]
はa
からz
までを表します。
他にも、\d
のようにバックスラッシュと文字で指定できる汎用的な文字クラスがいくつか用意されています。
よく使われる文字クラス
\d
:ASCII文字での数字。[0-9]
と同じ。
\D
:ASCII文字での数字以外。[^0-9]
と同じ。
\s
:Unicode空白文字。改行なども含まれています。
\S
:Unicode空白文字以外。
\w
:ASCII文字での単語文字。[A-Za-z0-9_]
と同じ。
\W
:ASCII文字での単語文字以外。[^A-Za-z0-9_]
と同じ。
.
:Unicodeの行末文字(改行)以外の文字。
正規表現中のエスケープ
^
で否定を表すように、正規表現では特別な意味を持つ文字がいくつかあります。
この^
自体を正規表現で使用したいときには\
でエスケープする必要があります。
以下はエスケープしている文字自体を表します。
\^
, \$
, \\
, \.
, \*
, \+
, \?
, \(
, \)
, \[
, \]
, {
, }
, \|
, \/
文字によっては\
をつけると、\d
のように別の意味を持つようになるため注意が必要です。
正規表現のフラグ
正規表現//
の2つ目の/
のあとに特定の文字(フラグ)を記述することで、正規表現の動作を変更できます。
フラグには、g
,i
,m
,s
,u
などがあります。
g
フラグ
//g
のようにg
を指定すると、正規表現に最初にマッチしたものだけでなく、文字列内での全てのマッチを検索するようになります。
i
フラグ
大文字・小文字の区別をしなくなります。
m
フラグ
文字列が改行されている場合、^
と$
は文字列の先頭と末尾だけでなく、各行の先頭と末尾にもマッチするようになります。
s
フラグ
.
が改行も含めてマッチするようになります。
u
フラグとUnicode 文字クラス
\u{}
によるコードポイントの指定や\p{}
、\P{}
の使用が可能になります。
/\u{61}/
はuが61回繰り返したものにマッチしますが、/\u{61}/u
はコードポイントU+0061
、a
にマッチするようになります。
また、サロゲートペア文字など複数の文字として扱われてしまう文字も1文字として扱われるようになります。
他にも、\p{}
によってUnicode文字クラスを使用することができるようになります。
/\p{Decimal_Number}/u
のようにUnicode文字プロパティを指定することができます1。
/\p{Decimal_Number}/u.test('٣') //true
/\d/.test('٣') //false
\d
ではアラビア数字の0から9にしかマッチしませんが、/\p{Decimal_Number}/u
であればインド数字٣
2などにもマッチするようになります。
y
フラグ
RegExp
メソッドであるexec
やtest
で正規表現オブジェクトのlastIndex
番目のインデックスから検索するようになります。
また、String.prototype.match
とRegExp.prototype.exec
の挙動が変わります。