2010-12-27 3 views
24

MDN sagt:Was sagt Regex 'y'?

eine "sticky" Suche ausführen zu können, dass Spiele in der aktuellen Position in der Zielzeichenfolge beginnen, die Flagge y verwenden.

Ich verstehe es nicht ganz.

Antwort

30

Objekte mit regulärem Ausdruck haben eine lastIndex Eigenschaft, die je nach den Flags g (global) und y (sticky) unterschiedlich verwendet wird. Das Flag y (sticky) weist den regulären Ausdruck an, bei lastIndex und nur um lastIndex (nicht früher oder später in der Zeichenfolge) nach einer Übereinstimmung zu suchen.

Beispiele sind im Wert von 1024 Wörter:

var str = "a0bc1"; 
 
// Indexes:
 

 
var rexWithout = /\d/; 
 
var rexWith = /\d/y; 
 

 
// Without: 
 
rexWithout.lastIndex = 2;   // (This is a no-op, because the regex 
 
            // doesn't have either g or y.) 
 
console.log(rexWithout.exec(str)); // ["0"], found at index 1, because without 
 
            // the g or y flag, the search is always from 
 
            // index 0 
 

 
// With, unsuccessful: 
 
rexWith.lastIndex = 2;    // Says to *only* match at index 2. 
 
console.log(rexWith.exec(str)); // => null, there's no match at index 2, 
 
            // only earlier (index 1) or later (index 4) 
 

 
// With, successful: 
 
rexWith.lastIndex = 1;    // Says to *only* match at index 1. 
 
console.log(rexWith.exec(str)); // => ["0"], there was a match at index 1. 
 

 
// With, successful again: 
 
rexWith.lastIndex = 4;    // Says to *only* match at index 4. 
 
console.log(rexWith.exec(str)); // => ["1"], there was a match at index 4.
.as-console-wrapper { 
 
    max-height: 100% !important; 
 
}


Kompatibilität Hinweis:

Spider JavaScript-Engine Firefox hat die y Flagge schon seit Jahren, aber es wasn Teil der Spezifikation bis ES2015 (Juni 2015). Auch hatte Firefox für eine ganze Weile a bug in the handling of the y flag in Bezug auf die ^ Behauptung, aber es wurde irgendwo zwischen Firefox 43 (hat den Fehler) und Firefox 47 (nicht) behoben. Sehr alte Versionen von Firefox (zB 3.6) hatten y und hatten den Fehler nicht, also war es eine Regression, die später passierte (nicht definiertes Verhalten für das Flag y), und dann behoben wurde.