正規表現

RegExpオブジェクト

RegExpオブジェクトは、正規表現のためのオブジェクトです。

オブジェクトの生成

正規表現リテラル (regular expression literal)

文字列をスラッシュで囲んで記述することで、正規表現のパターンを指定する正規表現リテラルとみなされます。たとえば、

var pattern = /[0-9]+/g;

とすると、patternはRegExpオブジェクトとして生成されます。

コンストラクタ

通常は正規表現リテラルでも代用できますが、正規表現のパターンを動的に生成する必要があるときには、コンストラクタにより明示的に生成します。

new RegExp( pattern [, flags ] );

このオブジェクトを生成するには、

var pattern = new RegExp( '[0-9]+', 'g' );

のようにします。このコードにより生成されるRegExpオブジェクトは、前述の正規表現リテラルと同一です。

new RegExp( 'a' ); // /a/
new RegExp( '' );  // /(?:)/

new RegExp( '[0-9]+', 'g' ); // /[0-9]+/g
フラグ (flags)

コンストラクタのflags引数には、次のいずれかを指定できます。

文字 意味
i 大文字と小文字を区別しない
g グローバル検索 (グローバルマッチ)

一致するもの、すべてを検索する。

m マルチラインモード

「^」は文字列と行の先頭、「$」は文字列と行の末尾に一致させる。

Perlなどのマッチモードにあるsフラグ (シングルラインモード) はサポートされないため、複数行を処理できません

プロパティ

プロパティ 説明
global 「g」属性を持つかどうか
ignoreCase 「i」属性を持つかどうか
multiline 「m」属性を持つかどうか
lastIndex 最後にマッチした文字の位置
source 正規表現オブジェクトのソーステキスト

メソッド

メソッド 説明
exec 文字列のパラメータでマッチングを行う
test 文字列にパターンが含まれているか調べる
メソッド - RegExp - JavaScript | MDN

RegExp.exec()

通常のパターンマッチングでは行えないような複雑な処理をするには、exec()メソッドを使用します。とくにグローバルマッチで部分正規表現を取得するには、このメソッドでなければなりません。exec - JavaScript | MDN

たとえば次のコードを実行した場合、

var text = 'Hello! world';
var pattern = /l+/g;

var match;
while( match = pattern.exec( text ) )
{
    // @todo
}

exec()の結果は、

ループ回数 match match.index match.input
1回目 ["ll"] 2 "Hello! world"
2回目 ["l"] 10 "Hello! world"
3回目 null ---

のように返されます。

RegExp.test()

regexObj.test( str );
RegExp.test - JavaScript | MDN
new RegExp( '[0-9]' ).test( 'abc' ); // false
new RegExp( '[0-9]' ).test( '123' ); // true

文字クラス

指定文字のいずれかにマッチする、文字クラスがサポートされます。

略記法

文字クラスの略記法もサポートされます。

メタ文字を文字列リテラルで記述するときは、エスケープが必要です。

メタ文字 ※1 意味 別表記
\d 任意の数字 (Decimal digit) [0-9]
\w 任意の単語文字 (Word) [a-zA-Z0-9_]
\s 任意のUnicode空白文字 (White space) [ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​-\u200a​\u2028\u2029\u202f\u205f​\u3000] ※2
Using special characters - Regular Expressions - JavaScript | MDN

※1 メタ文字を大文字にすると、それを否定した意味になります。
※2 幅ゼロの空白文字\u200B\uFEFFは含まれません。

メタ文字に不足する文字がある場合には、全体を[]で囲み文字を追加します。

/[\da-z]/

サポートされない機能

Perlの正規表現と比較して、次の機能が使用できません。

  • フラグ
    • sフラグ (シングルライン モード)
    • xフラグ (フリーフォーマット モード)
  • エスケープシーケンスの一部
    • \a\e\l\u\L\U\E\Q\A\Z\z\G
  • (?拡張構文の一部

記述上の注意

メタ文字のエスケープ

文字列リテラル正規表現リテラルでは、文字列中のバックスラッシュの扱いが異なります。よってこの2つを書き換える際には、注意が必要です。

たとえば「?」という記号にマッチさせる場合を考えます。これは量指定子のメタ文字であるため、

/\?/

のように、正規表現ではこれをバックスラッシュでエスケープする必要があります。一方でこの表現をそのまま文字列リテラルに当てはめて、

new RegExp( '\?' )

とすると、「SyntaxError: invalid quantifier」の例外が発生します。これは「\?」というエスケープシーケンスが存在しないため「?」と解釈され、結果として不正な正規表現となっているためです。

このとき文字列リテラルにバックスラッシュを記述するには「\\」とすることを踏まえると、正しくは

new RegExp( '\\?' )

とすべきことがわかります。

バックスラッシュへのマッチ

文字列リテラルにバックスラッシュを記述するにはエスケープが必要であり、かつバックスラッシュにマッチさせるためにもエスケープが必要であることから、バックスラッシュにマッチさせるためには、

new RegExp( '\\\\' )

のように記述します。一方で正規表現リテラルで記述するときはバックスラッシュのエスケープは不要なため、

/\\/

とします。≫PHPの正規表現でバックスラッシュにマッチさせる方法

参考

参考書