JavaScript, Neo-Generation
Written 1/16/00
12. String(2)
String オブジェクトで正規表現がらみのメソッドを紹介します。
match メソッド
パターンにマッチした文字列の配列を返します。
  stringObj.match(rgExp)
 
例えば、次のように使います。
    var str = "abcabb";
    alert(str.match(/ab/g));    //ab,ab
 
上の例では一番前と後の方の2ヶ所でマッチして長さ2の配列が返ります。
このメソッドは Regular Expression オブジェクトexec と同じように RegExp オブジェクトに検索結果が反映されます。
    var str = "abcabb";
    var rgexp = new RegExp("a(b)+", "g");
    alert(str.match(rgexp));    //ab,abb
    alert(RegExp.$1);           //b
 
カッコでサブマッチさせるときで、 g フラグが立っていない場合は特別で、 返ってくる配列は、
    マッチした文字列全体, サブマッチ1, サブマッチ2,...
 
となります。
    var a = "a1 a2 a34 a567".match(/a(\d+) a(\d+)/);
    alert(a);               //a1 a2,1,2
 
g フラグが立っているときは他と同じように マッチした全体の配列が返りますが、 サブマッチは最後のマッチに関するものが RegExp に記憶されます。
    var a = "a1 a2 a34 a567".match(/a(\d+) a(\d+)/g);
    alert(a);                           //a1 a2,a34 a567
    alert(RegExp.$1 + "," + RegExp.$2); //34,567
 
search メソッド JavaScript 1.2 JScript 3
パターンにマッチした部分の文字列の先頭からの位置を返します。
  stringObj.search(rgExp)
 
マッチしなかった場合は -1 を返します。 indexOf メソッドの正規表現版だと思ってください。
    var rgexp = new RegExp("a(b)+", "g");
    alert("abcabb".search(rgexp));       //0
    alert("acbacb".search(rgexp));       //-1
 
split メソッド JavaScript 1.1 JScript 3
文字列を引数の文字列または Regular Expression オブジェクトで区切って生成された Array オブジェクトを返します。
  stringObj.split(rgExp[,limit])
  stringObj.split(stringObj[,limit])
 
JavaScript1.1 では Regular Expression オブジェクトは使えません。
  var str = "1/16/2000 16:41:12";
  alert(str.split(" "));         //1/16/2000,16:41:12
  alert(str.split(/[\/ :]/));    //1,16,2000,16,41,12
 
2つ目の例は、"/"か" "か":"のどれかで分割して、 結局長さ6の Array オブジェクトを返しています。

JavaScript1.2 以上では返る Array の長さを制限できます。

  var str = "1/16/2000 16:41:12";
  alert(str.split(/[\/ :]/, 2)); //1,16
 
上の例では Array オブジェクトの要素を2つに限っています。

ネスケでは正規表現の中にパレーンを使うと、 そのパレーン内にマッチした文字列も配列の要素として返ります。

  alert("11 : 12".split(/\s+(:)\s+/))    //["11",":","12"]
 
ネスケで<SCRIPT>タグで JavaScript1.2を指定すると、 split(" ") としたときに限り 重なったスペースや改行といったホワイトスペースは 1つのスペースとみなされて split されます。 前後のホワイトスペースは無視されます。
  alert(" a \t\nb ".split(" "));         //["a","b"]
 
IE では正規表現を引数にすると重なった文字列は1つとみなされて split されます。 前後のスペースは無視されます。
  alert(" a  b ".split(/ /));            //a,b
 
replace メソッド JavaScript 1.0 JScript 3
文字列の置換を行い、その結果を返します。
  stringObj.replace(rgExp, replaceText])
 
正規表現にマッチした部分を指定した文字列に置き換えます。 RegExp オブジェクトに結果が反映されます。 対象の String オブジェクトに影響はありません。
  var str = "ほえほえハッピー";
  //str.replace(/ほえ/g, "ほげ")とやりたいんだけど
  //なぜかネスケではうまくいかない
  var rgexp = new RegExp("ほえ", "g");
  alert(str.replace(rgexp, "ほげ"));        //"ほげほげハッピー"
  alert(str);                               //"ほえほえハッピー"
 
置換する文字列には検索の結果を使うことができます。
  var str = "第8号 第256号";
  alert(str.replace(/第(\d+号)/g, "$1"));   //8号 256号
 
n号をn号に置換します。 $1 をダブルクォートで囲んで、RegExp.$1 の内容とします。
$2、...、$9 も同様に使えます。
  var str = "1/16/2000 16:41:12";
  var rgexp = /(\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+)/;
  var repl = "$3年$1月$2日 $4時$5分$6秒";
  alert(str.replace(rgexp, repl));   //2000年1月16日 16時41分12日
 
実はもっと複雑な置換を行うことができるのですが、 それは 正規表現(3) で取り扱っています。
ところで、"$1" という文字列に置換したい場合はどうすればよいのでしょうね。
Back