// Пытаемся найти общее количество овощей.
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); // ??
Пояснение
Любое регулярное выражение в JavaScript - это объект. У объекта класса RegExp есть свойство lastIndex, используемое многими методами.
Метод RegExp.prototype.exec() всегда ищет только одно совпадение, а при использовании флага g ищет совпадение не с нулевой позиции в строке, а позиции lastIndex объекта регулярного выражения.
Метод RegExp.prototype.exec(), когда находит совпадение во время своей работы, изменяет свойство lastIndex на номер позиции символа, следующим за совпадением. Или ставит lastIndex равным 0, если совпадения нет.
Таким образом, при повторном использовании метода exec на том же самом объекте регулярного выражения с флагом g, хоть и передевая параметром другую строку, будет использоваться значение lastIndex, вычисленное в последний раз.
По этой причине в задаче число 4 не будет найдено, ведь lastIndex остался прежним.