正規表現で文字列を split すると、できた配列から空の要素が消える

具体的には改行を含むテキストを1行1要素の配列にぶった切ろうと思って以下の処理を行った。

var arr = str.split( /(?:\r\n|[\r\n])/ );

すると以下のように IE というか JScript エンジンだけ(つまり WSH でも同じ)できあがった配列から空の要素が消え、空行がなかったことになってしまう。

エンジン空要素
JScript 5.6消える
Firefox 1.5.4消えない
Safari 1.3消えない
Opera 8.5消えない

これは正規表現をシンプルにしても同じ。

var arr = str.split( /\n/ );

ただし、文字列で split すると JScript でも空要素は消えない。

var arr = str.split( "\n" );

それなんて「仕様」?

document.write() の連発がださいけど下のスクリプトをコピペして開いてもらうと確認できる。IE では 6 と表示されるが、IE 以外では 7 と表示される1

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html">
    <meta http-equiv="Content-Script-Type" content="text/javascript">
    <title>Test of split with RegExp</title>
  </head>
  <body>
    <h1>Test of split with RegExp</h1>
    <script type="text/javascript"><!--
document.open();
var str = "wedjweo\nweoidjwe\nweiodjw\n\nweid\nwoeid\nweoij";
var arr = str.split( /(?:\r\n|[\r\n])/ );
document.write( '<pre>' );
document.writeln( '<h2>original text</h2>' );
document.writeln( str );
document.writeln( '<h2>number of array items</h2>' );
document.writeln( arr.length );
document.writeln( '<h2>splitted array</h2>' );
document.writeln( arr );
document.writeln( '<h2>rebuilded text</h2>' );
document.write( arr.join( "\n" ) );
document.writeln( '</pre>' );
document.close();
    // -->
    </script>
    <p>
If you use split with RegExp,
JScript engine automatically remove array's empty item :-(
    </p>
  </body>
</html>
  1. MacIE 5 では正規表現の (?: の書き方に対応してないのでどのみち動きません。 

More