2015-06-18 2 views
2

Я немного абстрагирую свой код, поскольку он в конечном итоге входит в коммерческий продукт. У меня возникли проблемы с получением теста регулярного выражения, чтобы вернуть правильные результаты.JavaScript не возвращает ожидаемые результаты регулярного выражения

var files = [ 
    "Jurassic%20Park%20-%20Nedry.mp4", 
    'Jeb%20Corliss%20Grinding%20The%20Crack.mp4' 
]; 
var filterSearch = function(text){ 
    var filter = new RegExp(text, 'gi'); 
    var displayFiles = files.filter(function(file){ 
     return filter.test(file.toLowerCase()); 
    }); 
    console.log(displayFiles); 
} 

Если я бегу filterSearch («J») или filterSearch («N») Я бы ожидать, чтобы получить 2 результаты, Парк Юрского периода и Джеб, вместо этого я просто получаю один. Кажется, что он работает правильно для всех других персонажей, разделяемых между двумя файлами, но не для J или N. Кто-нибудь знает, почему это не работает должным образом для меня? Спасибо,

Редактировать: Я могу повторить это на repl.it.

ответ

3

Используйте String.prototype.search() вместо функции test().

Пример

var filterSearch = function(text){ 
    var filter = new RegExp(text, 'gi'); 
    var displayFiles = files.filter(function(file){  
     return file.search(filter) != -1 ? true : false ; 


    }); 
    console.log(filter); 
    console.log(displayFiles); 
} 

filterSearch('J'); 

даст вам выход

["Jurassic%20Park%20-%20Nedry.mp4", "Jeb%20Corliss%20Grinding%20The%20Crack.mp4"] 

Это происходит потому, что test() называют несколько раз на тот же глобальный обычный экземпляр выражения будет продвигаться мимо предыдущего матча. (As stated per the MDN reference)

+0

Это подействовало. Я создал несколько тестовых файлов со всеми буквами алфавита/номера для подтверждения, и он работает. Благодаря! – user2684405

+0

@ user2684405 Добро пожаловать. Рад помочь :) – nu11p01n73R

0

При вызове теста на RegExp он сохраняет LastIndex свойство последнего матча (см https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test для получения более подробной информации). При следующем поиске (даже в другой строке) lastIndex + 1 является исходной позицией поиска.

Самый простой способ предотвратить это - оставить глобальный флаг в определении регулярного выражения (который в этом случае не нужен) или просто сбросить lastIndex на -1 на каждой итерации функции searchFilter.

0

Когда глобальный (g) флаг используется с test() или exec(), lastIndex устанавливается в следующую позицию последнего совпадения. Вы должны либо сбросить filter.lastIndex 0 или вы могли бы на самом деле опустить «г» флаг

Читайте о lastIndex

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