- 締切済み
正規表現 testメソッドの結果が異なる件について
環境:Windows2000 SP4 JScriptの質問なのですが、 正規表現オブジェクトのtest()が、グローバル?とインスタンスで異なる結果を出す為少々困惑しています。 具他的には、 // --- script -- var reg1 = /\s+/g; // グローバルなスコープを持つ正規表現オブジェクト? var reg2 = new RegExp( "\s+" ,"g" ); // インスタンス var target = "hello world"; // 判定対象 // テスト開始 WScript.Echo( "/\\s+/g.test( 'hello world' ) を3回。" ); for(var i=0; i< 3; i++) WScript.Echo( reg1.test( target ) ); WScript.Echo( "regExp('\\s+','g').test( 'hello world' ) を3回。" ); for(var i=0; i< 3; i++) WScript.Echo( reg2.test( target ) ); // --- end -- 実行した結果は、通常の正規表現インスタンスは思惑通りですが、 グローバルなスコープを持つインスタンスでは、結果が異なってしまいます。 直接記述した正規表現は、実行時にコンパイルされグローバルなスコープを持つインスタンスとして生成され、new() で作成したものは通常のスコープを持つインスタンスとして理解しています。 また、ヘルプには test() の実行はグローバル変数に何ら影響を及ぼさないと記述されています。 どこがおかしいのか分らないため、困惑しています。 ご教示いただければ幸いです。 また、質問箱的に何かおかしな点などありましたら、お手数ですがお知らせください。手直し、質問の取り消し等対処いたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- deadline
- ベストアンサー率63% (1239/1943)
RegExp内で"\"を記述する際には、"\\"にする必要があります。 var reg2 = new RegExp( "\s+" ,"g" ); ↓↓↓ var reg2 = new RegExp( "\\s+" ,"g" );
お礼
ご回答ありがとうございます。 すみません。エスケープ失念していました。 結果は同じになりましたが、やはり実行結果が異なります。 var reg = /\s+/g; // (A) for(var i=0; i<3; i++) WScript.Echo( reg.test( "hello world" ) ); // -1,0,-1 が返る // (B) for( var i=0; i<3; i++) WScript.Echo( /\s+/g.test( "hello world" ) ); // -1が返る
補足
すみません。解決しました。 グローバルオプションがインデックスを保持していました。 test()し、マッチしたインデックスを保持し、次回実行時にそこから判定していた為、 1度目はマッチ。 2度目はlastIndexから判定。マッチしない。 3度目は最初から判定しなおし、マッチする。 var r = /\s+/g; WScript.Echo( r.test( "a b" ) + "\nlastIndex="+r.lastIndex にて確認しました。 お手数かけてすみませんでした。