2010-12-27 1 views
24

MDN говорит:Что делает флаг regex 'y'?

Чтобы выполнить «липкий» поиск, что матчи, начиная с текущей позиции в целевой строке, используйте флаг у.

Я не совсем понимаю.

ответ

30

Объекты регулярных выражений имеют свойство lastIndex, которое используется по-разному в зависимости от g (0) y (sticky) flags. Флаг y (sticky) указывает регулярному выражению искать соответствие по lastIndex и только по адресу lastIndex (не ранее или позже в строке).

Примеры стоят 1024 слов:

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; 
 
}


Совместимость Примечание:

двигатель SpiderMonkey JavaScript браузера Firefox имел y флаг в течение многих лет, но это WASN Часть спецификации до ES2015 (Июнь 2015 г.). Кроме того, довольно долго Firefox имел a bug in the handling of the y flag в отношении утверждения ^, но он был исправлен где-то между Firefox 43 (есть ошибка) и Firefox 47 (нет). Очень старые версии Firefox (скажем, 3.6) имели y и не имели ошибки, поэтому это была регрессия, которая произошла позже (не определено поведение для флага y), а затем исправлено.

0

Вы можете найти пример здесь:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp#Example.3a_Using_a_regular_expression_with_the_.22sticky.22_flag

Кроме того, что IMHO пример должен быть

var regex = /^(\S+) line\n?/y; 

вместо

var regex = /(\S+) line\n?/y; 

поскольку с этой линией код дает тот же результат, говорят ли вы

var regex = /(\S+) line\n?/y; 

или

var regex = /(\S+) line\n?/g; 

 Смежные вопросы

  • Нет связанных вопросов^_^