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) をご覧ください。
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 メソッドを使います。
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.6 | IE 5.0 | IE 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 | ○ | × | ○ |