[JavaScript] String.match( regexp ) の返り値は何か?/ 正規表現の変わりに文字列を使うとどうなるのか

ここを参考にいろいろとテストしてみる。

match する場合の返り値 と しない場合の返り値

  • する場合は Arrayオブジェクト が返る
  • しない場合は null が返る

    document.write(
    '12345'.match(/0/)
    );
    

結果

null
var x = '12345'.match(/234/);
document.write(
  x + "\n" + x.constructor
);

結果

234
function Array() {
    [native code]
}
var x = '1234512345'.match(/234/g);
document.write(
  x + "\n" + x.constructor
);

結果

234,234
function Array() {
    [native code]
}

matchしない場合を考慮しないとエラーになる場合

function x(str){
  alert(
    str.match(/foobar/)[0]
  );
}
x("foobar"); // 「foobar」とアラート
x("hoge"); // str.match(/foobar/) is null

関数に match を入れる場合などにこういう記述をすると null が返ってきたときにエラーとなる。だから !== null でチェックしてから配列を読みに行かないとダメ。

戻り値の配列の中身

function dump(o){
  var s = '';
  for(var k in o){
    s += k + ' | (' + typeof(o[k]) + ') ' + o[k] + "\n";
  }
  document.write(s);
}
var x = '123456123456'.match(/(34)(56)/);
dump( x );

結果

0 | (string) 3456
1 | (string) 34
2 | (string) 56
index | (number) 2
input | (string) 123456123456
  • 0 : マッチした文字列全体が入る
  • 1~ : それぞれのキャプチャ
  • index : マッチした場所 (bite値 じゃなくて 0から数えて何番目の文字か?)
  • input : 検索される側の文字列

    // gフラグがある場合
    var x = '123456123456'.match(/(34)(56)/g);
    dump( x );
    

結果

0 | (string) 3456
1 | (string) 3456

gフラグがあるときは indexプロパティ と inputプロパティ、キャプチャの情報 は*無い*。マッチした文字列全体を配列にして返す。

正規表現の変わりに文字列を使うとどうなるのか

document.write(
  '[foo]'.match('\\[foo\\]')
);
document.write(
  '[foo]'.match(new String('\\[foo\\]'))
);

結果

[foo]

文字列は正規表現に変換されてから実行されるっぽい。ただコレではフラグを立てれない

document.write(
  'AAA'.match('a', 'ig')
);

FireFox と GoogleChrome で動作が違ったので却下。使えない。。FireFox だと2番目の引数をフラグとして見てくれる

document.write(
  '[foo]'.replace('\\[foo\\]', 'Success')
);

結果

[foo]

でもString.replaceでは文字列を正規表現としてみてくれないんだな…

Share
関連記事