Мои задачи по Javascript
Случайная задача
Список всех задач

Задача 22

// Пытаемся найти общее количество овощей.

var str1 = 'Возьмите 5 огурцов, 2 помидора, порежьте, посолите.';
var str2 = 'Возьмите 4 картошки, потрите на тёрке их с 1 морковью.';

var regex = /\d+/g;

var result;
var sum = 0;


result = regex.exec(str1);
if (result !== null) { sum += +result[0]; } 

result = regex.exec(str1);
if (result !== null) { sum += +result[0]; }

result = regex.exec(str2);
if (result !== null) { sum += +result[0]; }

result = regex.exec(str2);
if (result !== null) { sum += +result[0]; }

console.log(sum); // ??
Что выведет консоль?
1
2
3
4
5
6
7
8
9
10
11
← Задача 21Задача 23 →
Пояснение Любое регулярное выражение в JavaScript - это объект. У объекта класса RegExp есть свойство lastIndex, используемое многими методами.

Метод RegExp.prototype.exec() всегда ищет только одно совпадение, а при использовании флага g ищет совпадение не с нулевой позиции в строке, а позиции lastIndex объекта регулярного выражения.
Метод RegExp.prototype.exec(), когда находит совпадение во время своей работы, изменяет свойство lastIndex на номер позиции символа, следующим за совпадением. Или ставит lastIndex равным 0, если совпадения нет.

Таким образом, при повторном использовании метода exec на том же самом объекте регулярного выражения с флагом g, хоть и передевая параметром другую строку, будет использоваться значение lastIndex, вычисленное в последний раз.

По этой причине в задаче число 4 не будет найдено, ведь lastIndex остался прежним.



Написать сообщение - отзыв, пожелание и т.п.