[JavaScript] 文字列を正規表現で切り分ける関数書いたよ!

文字列を正規表現で分割する関数を書いた。MSIE8, FireFox3, Chrome8 で動作確認。

[追記] String.split に正規表現を指定すれば同じことできた。

/**
 - 文字列を正規表現で分割する
 - split みたいなものだけど
 - split と違って正規表現にマッチした部分も返す
 - マッチした部分の前後に文字が無い場合に空文字を切り出す(?)のは仕様
 - @param string str 分割したい文字列
 - @param regexp re 正規表現 必ずgフラグを立てること
 - @param array results 偶数キーはマッチしなかった部分。奇数キーはマッチした部分
 */
function carve( str, re )
{
  // 文字列チェック
  if( str === '' || str === undefined || str === null ) return false;

  // gフラグのチェック
  if( re.global !== true ) return false;

  // 分割
  var results = [];
  // RegExp.input = str ; MSIEに効かない
  for( var i = 0, start = 0, match ; match = re.exec(str) ; start = re.lastIndex )
  {
    results[i] = str.substring( start, match.index );
    i++;
    results[i] = match[0];
    i++;
  }
  if( ! i ) return [str];
  results[i] = str.substring( start );

  return results;
}

var x = carve( '-a-b-c-d-e-', /[abcde]/g );
var y = carve( '111***222***333', /\d+/g );
var z = carve( 'hoge', /hoge/g );

function d(arr){
  var s = '';
  for( var i = 0, l = arr.length; i < l; i++ )
  {
    s += i + ' | ';
    s += ( arr[i] === '' ? '空文字' : arr[i] ) + "\n";
  }
  document.write( s, "\n" );
}
d(x);d(y);d(z);

結果

0 | -
1 | a
2 | -
3 | b
4 | -
5 | c
6 | -
7 | d
8 | -
9 | e
10 | -

0 | 空文字
1 | 111
2 | ***
3 | 222
4 | ***
5 | 333
6 | 空文字

0 | 空文字
1 | hoge
2 | 空文字

途中でハマッタ

MSIE の RegExp.input に値を入れることができなかった

var re = /x/g;
var str = "----x--";
RegExp.input = str;
re.exec();

上のコードは期待したような結果が返ってこなかった。re.exec( str ) としないとダメ。ChromeとFireFoxは問題なかった

Share
関連記事