2009-08-25 15 views
1

Die folgende Code Ergebnisse in "undefiniert" für liest:Ein seltsames regex Problem

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

document.write(r.lastIndex); 

Allerdings funktioniert es perfekt für r.index (und R.Eingang).

Ich benutze Firefox. Hat jemand eine Ahnung?

EDIT: OK, der obige Code funktioniert perfekt in IE! Außerdem funktioniert es in Firefox perfekt, wenn statt r.lastIndex in Zeile 5 a.lastIndex aufgerufen wird. Es sieht so aus, als würde Firefox die lastIndex-Eigenschaft im Ergebnis nicht zurückgeben, sondern nur die Eigenschaft für das Muster, das exec() aufruft. Interessant, dass IE beides setzt.

Antwort

4

Dies ist einer dieser Orte, wo Microsoft entschieden, ein paar Sachen in die Sprache und Handlung hinzuzufügen, als ob es sollte dort sein. Zum Glück bereinigen sie jetzt ihre Tat und dokumentieren solchen Unsinn.

Um es klar zu sagen: Firefox ist korrekt nach der ECMAScript Language Specification 3rd Edition (PDF, 705KB).

IE ist nicht korrekt; Sein Verhalten ist eine proprietäre Erweiterung. Es besteht kein Grund zu der Annahme, dass dieses IE-spezifische Verhalten jemals von einem anderen Browser unterstützt wird. Es ist sicherlich nicht im Moment. Weitere Informationen zu dieser Abweichung von der Spezifikation finden Sie unter (PDF, 580 KB, von Pratap Lakshman, Microsoft Corporation), einschließlich Tests, die keine Unterstützung für andere Browser bieten.

Beachten Sie auch, dass dies möglicherweise in Zukunft vom IE nicht unterstützt wird: Einige IE-bezogene IE-Mechanismen sind im IE8-in-IE8-Modus standardmäßig deaktiviert, und zukünftige Implementierungen von JScript finden möglicherweise einen Grund um diese Erweiterung für die Sprache ebenfalls zu deaktivieren.

4

lastIndex ist eine Eigenschaft von RegExp object. Also versuchen Sie dies:

a.lastIndex 
+0

last ist auch eine Eigenschaft des Ergebnisses durch exec() zurück sowie eine Eigenschaft des Musters Aufruf exec() –

+0

@Crimson: Nein, 'lastIndex' ist keine Eigenschaft des Rückgabewerts von' exec': 'r.hasOwnProperty (" lastIndex ")' returns * false *. Siehe auch https://developer.mozilla.org/de/Core_JavaScript_1.5_Reference/Global_Objects/RegExp/exec#Description – Gumbo

0

alle seltsam zu vermeiden, versuchen Sie diesen

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; 

Früher hier: http://www.pagecolumn.com/tool/regtest.htm