/(\d+):(\d+)/.exec("01:23");
alert(RegExp.$1 + "." + RegExp.$2); //01.23
とすると、RegExp.$1 に"01"が、
RegExp.$2 に"23"が入るわけですが、
これが正規表現の中でも使えます(ちょっと語弊があるかもしれませんが)。
alert(/年(\d+)月\1日/.test("2000年11月11日")); //true
alert(/年(\d+)月\1日/.test("2001年11月12日")); //false
上の正規表現は要するに月と日が同じ数字の日付を検索します。
\1 は最初のかっこの中と同じ文字列にマッチします。
これは置換にも用いることができます。
例えば次のようなテキストがあったとします。
ページタイトル,作成日,更新日 アロエヨーグルトの食べ方,2000/6/17,2000/6/17 ほしいのはおかしだけ,2000/6/18,2000/6/30これを1行ずつ読んで、作成日と更新日が同じ場合は更新日の方を「同左」 に置換します。
//1行ずつ読むのはめんどいので手抜き var str = "アロエヨーグルトの食べ方,2000/6/17,2000/6/17"; var str2 = "ほしいものはおかしだけ,2000/6/18,2000/6/30"; var re = /,(.+),\1/; //Regular Expressionオブジェクト str = str.replace(re, ",$1,同左"); //マッチする alert(str); str2 = str2.replace(re, ",$1,同左"); //マッチしない alert(str2);マッチした(2カラム目と3カラム目が同じ)場合、 2カラム目は $1 だからカッコ内、すなわち元と同じになり、 3カラム目は「同左」となります。
次はIE5.5版です。
var str = "へいへいへい"; str = str.replace(/(へい)+/, tomultiple); alert(str); //へい×3 function tomultiple(matchedString, subMatch1) { //何回繰り返しているか var n = matchedString.length / subMatch1.length; if(n == 1) return matchedString; else return subMatch1 + "×" + n; }replace メソッドはマッチした部分を2番目の引数の関数が返す値に置換します。 上では「へいへいへい」にマッチし、 tomultiple という関数が「へい×3」を返しています。
次はネスケ版です。
var str = "heiheihei"; str = str.replace(/(hei)+/, function (matchedString, subMatch1) { var n = matchedString.length / subMatch1.length; if(n == 1) return matchedString; else return subMatch1 + "×" + n; } ); alert(str);IE版とは関数を replace メソッドの中に書くところが違います。