2013-07-28 8 views
14

In Internet Explorer 10, dies:/.?e.?/ paßt gesamte Zeichenfolge, eher als erwartete Teilzeichenfolge

'abcdefghi'.match(/.?e.?/) 

zu ['def'] auswertet, wie ich erwarten würde, aber in Firefox 21,0, wertet auf ['abcdefghi']. (Siehe this jsFiddle.) Ich bekomme die gleiche Art von unerwartetem Verhalten für bestimmte andere Regexes, die beide mit optionalem Inhalt beginnen und enden, wie /.?e.{0,2}/ und /.{0,2}e.{0,2}/; Kommentatoren weisen jedoch auf verschiedene ähnliche Regexes hin, wie /\S?e\S?/ und /(?:.?e.?)/, die nicht betroffen sind. Gleiches gilt für die Methode replace.

Fehle ich etwas offensichtlich? Gibt es einen tiefen Grund für dieses Verhalten?

+0

Nun in Chrom sein: 'e de ef cdef' +1 für diese. –

+1

Nun, das Hinzufügen einer Gruppe scheint * zu korrigieren * es: ''abcdefghi'.match (/ (?:.? E.?) /)'. Aber ich vermute, Bug. –

+0

Das gleiche Problem taucht in Firefox 22 auf, aber es sollte angemerkt werden, dass '/.?.?/' ordnungsgemäß funktioniert, ebenso wie '/ e.? /' Und '/.? E /' – SheetJS

Antwort

6

Wie Tiffon sagte, ist dies ein Bug in SpiderMonkey (Firefox's JavaScript-Engine).

In SpiderMonkey verwenden wir die RegExp-Engine von Safari JavaScriptCore JS-Engine, und erbte den Bug davon. Ich habe bug 119191 für den Fehler in JSC abgelegt.

2

Sieht aus wie ein Fehler. Ich habe an issue eingereicht.

Btw, folgende Arbeiten fein:

'abcdefghi'.match(/.e./) 
'abcdefghi'.match(/.e.?/) 
'abcdefghi'.match(/.?e./) 
'abcdefghi'.match(/[a-z]?e.?/) 
'abcdefghi'.match(/.?e[a-z]?/) 

http://jsfiddle.net/afDqC/1/

+0

+1, danke! Es ist bedauerlich, dass ich zwei Antworten nicht akzeptieren kann. . . – ruakh

+0

@ruakh Kein Problem, danke! – tiffon

0

Wie die anderen Antworten erwähnt, scheint es ein Problem zu sein.

Allerdings gibt es eine einfache Abhilfe zur Verfügung: 'abcdefghi'.match(/(.?e.?)/)

Auf diese Weise erhalten Sie korrekte Ergebnisse sowohl [0] und [1] (die Untergruppe spezifiziert durch ()) (die implizite Untergruppe die gesamte Zeichenfolge die regex abgestimmt enthält)

+0

Tatsächlich hatte Jonathan Lonowski in einem Kommentar oben darauf hingewiesen (obwohl er vorgeschlagen hatte, eine nicht erfasste Gruppe '/ (?:.? E.?) /' Zu verwenden, die * keinen * Effekt hat, außer dass sie dies umgeht Fehler). – ruakh

Verwandte Themen