JavaScript 第5版 - 11章 正規表現パターンマッチング

JavaScript 第5版の「11章 正規表現パターンマッチング」(207~219ページ)を読み進めていきます。

11.1 正規表現の定義

ECMAScript 3の仕様では、Perl 5の正規表現とほぼ同じものが使用できます。正規表現については、同じくオライリーの詳説 正規表現 第3版が、わかりやすい上にかなり詳しく解説されているのでおすすめです。

11.1.7 JavaScriptでサポートされないPerlの正規表現機能

Perl 5の正規表現のうち、次のものはサポートされていません。

  • s(シングルラインモード)フラグとx(拡張構文)フラグ
  • \a、\e、\l、\u、\L、\U、\E、\Q、\A、\Z、\z、\Gエスケープシーケンス
  • (?<=(後読み言明アンカー)と(?<!(否定後読み言明アンカー)
  • (?#(コメント)やその他の(?拡張構文

11.2 パターンマッチング用の文字列メソッド

Stringオブジェクトには、正規表現を使ってパターンマッチングと検索・置換を行うメソッドが4つあります。

// search()メソッド
// 正規表現にマッチした文字列の先頭の文字位置を返す。見つからなかった場合は-1を返す。
'JavaScript'.search(/script/i);

search()メソッドではgフラグはサポートされません。また、引数に正規表現以外を指定すると、引数はRegExpコンストラクタに渡されます(=正規表現に変換される)。

// replace()メソッド
// 正規表現にマッチした文字列を検索/置換する。
'javascript'.replace(/javascript/gi, 'JavaScript');

replace()メソッドの引数に正規表現以外を指定すると、文字列そのものが検索されます。RegExpコンストラクタには渡されません。

// match()メソッド
// 正規表現にマッチした結果を配列で返す。
'1 plus 2 equals 3'.match(/\d+/g);  // ['1', '2', '3']
'1 plus 2 equals 3'.match(/\d+/);  // ['1']
'1 plus 2 equals 3'.match(/(\d+) plus (\d+) equals (\d+)/);  // ['1 plus 2 equals 3', '1', '2', '3']

match()メソッドの引数に正規表現以外を指定すると、引数はRegExpコンストラクタに渡されます(=正規表現に変換される)。gフラグを指定しない場合は、配列の1番目の要素に正規表現に一致した文字列全体が、2番目以降の要素に正規表現の()で囲まれた部分表現が格納されます。

match()メソッドが返す配列には、通常の配列と同じようにlengthプロパティがありますが、gフラグを指定しなかった場合に返される配列には、一致した文字列の開始位置を示すindexプロパティと、対象と文字列のコピーを格納したinputプロパティがあります。

// split()メソッド
// 文字列、または正規表現にマッチした文字を区切り文字として、文字列を分割する。
'123,456,789'.split(',');  // ['123', '456', '789']

11.3 RegExpオブジェクト

RegExpクラスのコンストラクタは、文字列からRegExpオブジェクトを生成します。

// エスケープシーケンスに / を使用するため、文字列中の / は、全て // に置き換える必要がある。
var zipcode = new RegExp("\\d{5}", "g");

11.3.1 パターンマッチング用のRegExpメソッド

RegExpオブジェクトには、パターンマッチングを実行する2つのメソッドがあります。

// exec()メソッド
/\d+/g.exec('1 plus 2 equals 3');  // ['1']
/\d+/.exec('1 plus 2 equals 3');  // ['1']
/(\d+) plus (\d+) equals (\d+)/.exec('1 plus 2 equals 3');  // ['1 plus 2 equals 3', '1', '2', '3']

exec()メソッドは、Stringオブジェクトのmatch()メソッドとは異なり、gフラグの有無にかかわらず、match()メソッドにgフラグを指定しなかったときの配列と同じ形式の配列を返します。

正規表現にgフラグが指定されていれば、RegExpオブジェクトのlastIndexプロパティに一致した文字列の直後の文字位置が設定されます。同じRegExpオブジェクトでexec()メソッドが呼び出された際には、lastIndexプロパティが示す文字位置から検索を開始します。マッチしなくなった場合は、lastIndexプロパティに0が設定されます。このため、gフラグとループを組み合わせることによって、正規表現にマッチする全ての文字列を調べることもできます。

// test()メソッド
// 引数に指定された文字列が正規表現とマッチすればtrueを返す。
/java/i.test('JavaScript');  // true

exec()メソッドの実行結果がnullでなければ、test()メソッドはexec()メソッドと同じような振る舞いをします。gフラグが指定されていれば、lastIndexプロパティも利用することができます。

11.3.2 RegExpインスタンスプロパティ

RegExpオブジェクトには5つのプロパティがあります。

  • sourceプロパティには、正規表現の本体である文字列が格納される。読み出し専用。
  • globalプロパティには、gフラグの設定の有無を示す論理値が格納される。読み出し専用。
  • ignoreCaseプロパティには、iフラグの設定の有無を示す論理値が格納される。読み出し専用。
  • multilineプロパティには、mフラグの設定の有無を示す論理値が格納される。読み出し専用。
  • lastIndexプロパティには、次に検索を開始する文字位置を示す整数が格納される。読み書き可能。

コメント (0)

この記事へのコメントはまだありません。

コメントフォーム

トラックバック (0)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/92/trackback/
この記事のURI
http://dxd8.com/archives/92/