JavaScript, Neo-Generation
Written 1/3/00
8. 正規表現(1)
もっとも簡単な使い方 JavaScript 1.2 JScript 3
正規表現とは対象となる文字列からある文字列のパターンを検索するために 用いるものです。例えば、次のように用います。
  alert(/bc/.test("abc"));       //true
  alert(/bc/.test("acb"));       //false
 
/bc/というのが正規表現です。要するに"b"と"c"が並んでいるパターンです。 この例は test メソッドの引数がこのパターンにマッチしているかどうかを判定しています。

このような単純な検索なら indexOf を使えば? ということになりますが、正規表現ではもっと強力な検索ができます。

  alert(/[0-9]+\/[0-9]+\/[0-9]+/.test("2000/1/1")); //true
  alert(/[0-9]+\/[0-9]+\/[0-9]+/.test("200a/1/1")); //これはfalse
  alert(/[0-9]+\/[0-9]+\/[0-9]+/.test("2000/1"));   //これもfalse
 
[0-9]は0から9のどれか1つ、+はその直前の文字を1回以上繰り返す、 \/は/を表します。前後の/と区別するため。 要するに、[数字列]/[数字列]/[数字列] と並んでいる文字列を検索します。 この場合正規表現は、
  /[0-9]+\/[0-9]+\/[0-9]+/
 
ですが、実は JavaScript では Perl と同じようにより簡単に表現できます。
  /\d+\/\d+\/\d+/
 
正規表現そのものについては、 正規表現の構文(MSDN) をご覧ください。
最新版はここ(12/21/01)。
exec メソッド JavaScript 1.2 JScript 3
test メソッドは単にマッチするかどうかを判定しますが、 exec メソッドを用いると もっと詳細な結果を得ることができます。
    var a = /(\d+)\/(\d+)\/(\d+)/.exec("2000/1/12");
    alert(a[1] + "年" + a[2] + "月" + a[3] + "日"); //2000年1月12日
    var b = /(\d+)\/(\d+)\/(\d+)/.exec("2000/1/a");
    alert(b);                                       //null
 
exec メソッドは Array オブジェクトを返します。 その最初の要素はマッチした文字列全体、 その次からの要素は 正規表現の()で括った部分がマッチした文字列が順に入ってきます。 上の例の場合、
  a[0] <- "2000/1/12"
  a[1] <- "2000"
  a[2] <- "1"
  a[3] <- "12"
 
となります。マッチしなかった場合は null を返します。

exec メソッドではグローバルフラグ g は効きません。 g を効かせるには match メソッドを使います。

RegExp オブジェクト JavaScript 1.2 JScript 3
exec メソッドでマッチした場合、 さらにその結果が RegExp オブジェクトに反映されます。
  var a = /(\d+)\/(\d+)\/(\d+)/i.exec("2000/1/12 8:11:52");
  alert(RegExp.$1 + "年" + RegExp.$2 + "月" + RegExp.$3 + "日");
  alert(RegExp.index);
  alert(RegExp.input);
  alert(RegExp.lastIndex);
  alert(RegExp.lastMatch);
  alert(RegExp.lastParen);
  alert(RegExp.leftContext);
  alert(RegExp.multiline);
  alert(RegExp.rightContext);
 
下の表は RegExp オブジェクトのプロパティの説明です。 なぜか、NC と IE でうまく働くものと働かないものがあります。

プロパティ説明上の例での値 NC 4.6IE 5.0IE 5.5
$1...$9括弧内のマッチした部分 $1:2000 $2:1 $3: 12
indexマッチした部分の頭の先頭からの位置 0×
input検索対象の文字列全体 2000/1/12 8:11:52×
lastIndexマッチした部分の最後の先頭からの位置 9×
lastMatch最後に一致した文字列 2000/1/12×
lastParen最後に一致した括弧内の文字列 12×
leftContextマッチした部分より左側の文字列  ×
multilineマッチした部分が複数行にまたがるかどうか false××
rightContextマッチした部分より右側の文字列 8:11:52×

Back