@AlexandrMa

Почему регулярное выражение не всегда соответствует строке?

Мой пример внезапно выдает не 5 чисел, а 4.
В других примера вообще через строку срабатывает.

const re = /[0-9]/g;
const data = ["12", "12", "12", "12", "12"].filter(i => re.test(i));
console.log(data);
//[ '12', '12', '12', '12' ]

Выражение сократил для примера, там будет другое.
Нужно прогнать все значения массива и отобрать только те, которые строго по регулярке подходят.
  • Вопрос задан
  • 93 просмотра
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Поскольку вы указали флаг global (g), то после успешного поиска .test() запоминает позицию, на которой остановился поиск, и при следующем вызове продолжает со следующей позиции.
re.test("12"), нашли 1 в позиции 0, стоим в позиции 1.
re.test("12"), нашли 2 в позиции 1, стоим в позиции 2.
re.test("12"), ничего не нашли, поиск окончен, сбрасываем позицию на 0.
re.test("12"), нашли 1 в позиции 0, стоим в позиции 1.
re.test("12"), нашли 2 в позиции 1, стоим в позиции 2.
Ответ написан
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
Читай доку по regexp https://developer.mozilla.org/en-US/docs/Web/JavaS...
JavaScript RegExp objects are stateful when they have the global or sticky flags set (e.g., /foo/g or /foo/y). They store a lastIndex from the previous match. Using this internally, test() can be used to iterate over multiple matches in a string of text (with capture groups).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы