2009-08-25 17 views
1

次のコードの結果は:奇妙な正規表現の問題

var a = /cat/g; 
var l = "A test sentence containing cat and dog."; 
var r = a.exec(l); 

document.write(r.lastIndex); 

しかし、それはr.index(およびr.input)のために完璧に動作します。

私はFirefoxを使用しています。誰かが手掛かりを持っていますか?

編集:OK、上記のコードはIEで完全に機能します。さらに、Firefoxでは、5行目のr.lastIndexを呼び出す代わりに、a.lastIndexが呼び出されると完全に機能します。 Firefoxは結果にlastIndexプロパティを返しません。むしろexec()を呼び出すパターンのプロパティを設定します。興味深いことに、IEは両方を設定します。

答えて

4

これは、Microsoftがそれはそこになるはずだったかのように言語と行為をいくつかのものを追加することを決定し、それらの場所の一つです。ありがたいことに、彼らは今、彼らの行為を浄化し、そのようなナンセンスを文書化しています。

明らかに:ECMAScript Language Specification 3rd Edition(PDF、705KB)によると、Firefoxは正しいです。

IEはではありません。が正しくなりました。その動作は独自の拡張です。このIE固有の動作が他のブラウザでサポートされるとは信じられません。確かに現時点ではありません。他のブラウザでサポートされていないことを示すテストを含め、仕様からのこの特定の逸脱の詳細については、JScript Deviations from ES3(Microsoft CorporationのPratap LakshmanによるPDF、580KB)を参照してください。

これはIEで将来サポートされないこともあります:IE8-in-IE8モードでは、独自のIE CSS関連のメカニズムがデフォルトで無効になっており、今後のJScriptの実装では、同様にこの言語拡張を無効にする。

4

lastIndexは、RegExp objectのプロパティです。だから、これを試してみてください。

a.lastIndex 
+0

lastIndexのものexec(によって返される結果のプロパティ)だけでなく、パターンの呼び出しのプロパティですexec() –

+0

@Crimson:いいえ、 'lastIndex'は' exec'の戻り値のプロパティではありません。 'r.hasOwnProperty(" lastIndex ")'は* false *を返します。 https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp/exec#Descriptionも参照してください。 – Gumbo

0

すべての奇妙なを避けるために、この

var a = /cat/g; 
var l = "A test sentence containing cat and dog."; 
var r = a.exec(l); 
var lastIndex = (r!=null) ? l.indexOf(r[0])+r[0].length : 0; 

を試してみてくださいそれは、ここで使用されます:http://www.pagecolumn.com/tool/regtest.htm