Unerwartetes Javascript RegExp-Verhalten [duplizieren]

8

Ich erstelle ein RegExp-Objekt (in JavaScript), um auf das Vorhandensein einer Zahl zu prüfen:

%Vor%

Ich benutze es so

%Vor%

Die Ausgabe ist noch verwirrender:

%Vor%

Wenn ich das Qualifikationsmerkmal g lösche, verhält es sich wie erwartet.

Ist das ein Fehler, wie ich es glaube, oder ein seltsamer Teil der Spezifikation? Soll der g -Kennzeichner auf diese Weise verwendet werden? (Ich benutze denselben Ausdruck für mehrere Aufgaben, daher habe ich das Qualifikationsmerkmal überhaupt)

    
Dave 21.03.2013, 23:11
quelle

3 Antworten

6

Pro Dokumentation: Ссылка

  

test , das mehrere Male für dieselbe globale reguläre Ausdrucksinstanz aufgerufen wird, geht über die vorherige Übereinstimmung hinaus.

Sie können dieses Verhalten bestätigen:

%Vor%

Es ist nicht sinnvoll, das g -Flag zu verwenden, wenn Sie nur eine einzige Übereinstimmung mit verschiedenen Strings bestätigen möchten.

    
Explosion Pills 21.03.2013, 23:19
quelle
5

Entfernen Sie das 'g' -Flag. Wenn Sie das Flag 'g 'verwenden, aktualisiert es die lastIndex -Eigenschaft der Regex (Vorbereitung für eine nachfolgende Suche in der gleichen Zeichenfolge) und startet dann die nächste Suche von diesem Indexwert (wodurch Sie eine falsche Lesung auf Ihrem geben) nächste Suche).

Ähnliche Fragen und Antworten hier: Warum ist Regex Javascript // g? Flagge beeinflussen Zustand?

    
jfriend00 21.03.2013 23:17
quelle
0

Laut MDN ,

  

Wie bei exec (oder in Kombination damit), wurde test mehrmals aufgerufen   auf der gleichen globalen regulären Ausdruck Instanz wird über die   vorheriges Spiel.

Technisch gesehen sagt die ECMAScript 5.1 Spezifikation

  

15.10.6.3 RegExp.prototype.test ( String)

     

Die folgenden Schritte werden ausgeführt:

     
  1. Die Übereinstimmung sei das Ergebnis der Evaluierung des RegExp.prototype.exec (15.10.6.2) -Algorithmus für dieses RegExp-Objekt mit string als   Argument.
  2.   
  3. Wenn nicht gleich null ist, geben Sie true ; sonst gib false zurück.
  4.   

15.10.6.2 RegExp.prototype.exec ( String)

     

Führt eine reguläre Ausdrucksübereinstimmung von string mit dem regulären aus   Ausdruck und gibt ein Array-Objekt mit den Ergebnissen der   match, oder null , wenn string nicht übereinstimmt.

     

Der String ToString ( string ) wird nach einem Vorkommen von   Regulärer Ausdruck Muster wie folgt:

     
  1. Sei R dieses RegExp-Objekt.
  2.   
  3. [...]
  4.   
  5. [...]
  6.   
  7. Lassen Sie lastIndex das Ergebnis des Aufrufs der internen Methode [[Get]] von R mit dem Argument " lastIndex " sein.
  8.   
  9. Sei i der Wert von ToInteger ( lastIndex ).
  10.   
  11. Sei global das Ergebnis des Aufrufs der internen Methode [[Get]] von R mit dem Argument " global ".
  12.   
  13. Wenn global false ist, dann i = 0.
  14.   
  15. [...]
  16.   
  17. [...]
  18.   
  19. Lassen Sie e r sein endIndex Wert sein.
  20.   
  21. Wenn global true ist,   
    1. Rufen Sie die interne Methode [[Put]] von R mit den Argumenten " lastIndex ", e und true .
    2. auf   
  22.   
  23. [...]
  24.   

Um dies zu vermeiden, können Sie

verwenden
  • Vermeiden Sie die Verwendung des globalen Flags g

    Auf diese Weise wird i in Schritt 7 0 anstelle von lastIndex .

    sein
  • Setzen Sie lastIndex nach jeder Verwendung manuell zurück

      

    Der Wert der Eigenschaft lastIndex gibt die Position der Zeichenfolge an an   welches das nächste Spiel beginnen soll.

    Zum Beispiel

    %Vor%
  • Verwenden Sie match oder search string-Methoden

    match setzt lastIndex auf 0 zurück und search ignoriert es:

      

    15.5.4.10 String.prototype.match ( regexp)

         

    [...] [Wenn] global ist true , rufen Sie die interne Methode [[Put]] von rx mit den Argumenten " lastIndex " und auf 0. [...]

         

    15.5.4.12 String.prototype.search ( regexp)

         

    [...] Durchsucht den Wert string von Anfang an nach einem Vorkommen von   Regulärer Ausdruck Muster rx . [...] Die lastIndex und global   Eigenschaften von regexp werden bei der Suche ignoriert. [...]

    Zum Beispiel

    %Vor%
Oriol 30.10.2014 18:49
quelle

Tags und Links