Спасибо большое, работает! Но не понял почему такое поведение... Флаг g не останавливает поиск при первом вхождении... Как в этой ситуации, этот флаг не даёт результат - не понимаю(
LaCosteGreen, тут важно понимать логику работы регулярки. вот к примеру -
let arr = ['ba','ab','ba','ab']
let reg = /a/gi
let filtered = arr.filter(str => reg.test(str))
console.log(filtered)
// вывод [ 'ba', 'ba' ]
но в то же время
let arr = ['ab','ba','b','ab','ba']
let reg = /a/gi
let filtered = arr.filter(str => reg.test(str))
console.log(filtered)
//вывод [ 'ab', 'ba', 'ab', 'ba' ]
Вопрос - почему? Нужно смотреть по итерациям, держа в памяти сказанное в ответе о том, что индекс последнего найденного элемента запоминается регуляркой.
let arr = ['ba','ab','ba','ab']
let reg = /a/gi
let filtered = arr.filter(str => reg.test(str))
/*итерация первая(ba): регулярка ищет букву А и находит ее на
индексе 1(нумерация у нас с 0). Окей, буква есть,
поэтому возвращаем true
Итерация вторая(ab): регулярка запомнила индекс, по которому
нашла первую букву, и поэтому начинает поиск с индекса 1.
Там у нас только b,поэтому возвращаем false.
ВНИМАНИЕ, ФОКУС!Если регулярное выражение, как в нашем
случае, не нашло совпадение, оно "забывает" индексы.
То есть считается что весь текст проверен.
Следующая итерация будет искать с начала. Поэтому...
Итерация третья ()
Итерация третья(ab) - смотри итерацию первую*/
console.log(filtered)
// вывод [ 'ba', 'ba' ]
Такое поведение может оказаться неочевидным при первом использовании. Да и по факту выходит что использование флага g в циклах - плохая идея если ты точно не знаешь зачем это тебе.
Спасибо всем большое! Я вроде разобрался) в моём примере получается что перед 'Max' регулярка останавливается и запоминает что остановился на 'Ludmila' (индекс a = 6) и в следующей итерации 'Max' поиск и начинается с этого индекса (6) а в Max всего 3 позиции.... Очень неочевидно при методе filter.. Я был уверен каждая итерация это новый вызов... С большой строкой я понимал)