JavaScript, Neo-Generation
Written 8/19/00
10. 正規表現(3)
ここではさらに複雑な正規表現の使用方法を紹介します。
後方参照 JavaScript 1.2? JScript 3?
  /(\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カラム目は「同左」となります。
関数を使った置換 JavaScript 1.3 JScript 5.5
上ではマッチした文字列を置換に使いましたが、 今度は置換する文字列を関数によって決めます。 リファレンスによるとネスケとIEでは記述方法が違うので気をつけてください。 ただしどちらでも動くようですが。
次の例では「へい」という文字が続けて出てきたら「へい×2」などと置換します。

次は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」を返しています。
関数の引数の matchedString にはマッチした部分が入ります。この場合は「へいへいへい」。 subMatch1 にはサブマッチした(かっこ内にマッチした) 部分が入ります。この場合は「へい」。

次はネスケ版です。

  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 メソッドの中に書くところが違います。
IEでも動きますね。
ネスケでは日本語の正規表現はできないんでしょうか。
Back