<< 2006/07/ 1 1. GNOME発見
2. リフレッシュ済みバッテリ受け取り
2 1. 久しぶりに iTunes でラジオ聞いた
3 4 5 1. ViewCVS の diff を等幅フォントで
6 7 1. 正規表現で文字列を split すると、できた配列から空の要素が消える
8 9 10 1. 楽々ERDレッスンを読んでいる
11 1. eclipse の内蔵 CVS って CVS コマンドと互換性ないのか
12 1. EasyEclipse なんてあるんだ
13 1. やっぱ最近の梅雨は7月だよな
2. jsUnit 利用時は cache を切れ
14 1. Unix 系 CLI 使いが一時的に Windows を使ううえで必要以上にイライラしないための最低限のバッチ7+1本
15 1. bs が便利
16 17 1. パーツショップのショッピングサイトってひどいんだなぁ
18 19 20 1. まだイケる
21 1. WSHでリモートのスクリプトを読み込んで実行、、、できない?
22 1. iCal って便利なのかも
23 24 25 26 27 28 1. 最近もっともだなぁと思ったこと
2. awk のハマりどころ
29 30 1. ちょっとぼおっとしてた
31 1. 『データベース村へようこそ』読了
>>
トップ «前の日記(2006-07-05) 最新 次の日記(2006-07-10)» 編集

2006-07-07 [長年日記]

_ 正規表現で文字列を 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>
Tags: Ecmascript MS

*1 MacIE 5 では正規表現の (?: の書き方に対応してないのでどのみち動きません。