Одна идея состоит в том, чтобы захватить (пронумеровать) что-нибудь (somefruit), как регулярное выражение, убедитесь, что он использует глобальный флаг, это позволяет вам зацикливаться для каждого найденного раздела.Использование групп захвата в регулярном выражении упрощает суммирование ...
Таким образом, простое регулярное выражение для этого -> /(\d).*?(apple|orange|kiwi|banana)/g
Также обратите внимание .*?
, это называетсянет жадного захвата, если его не использовать, он будет продолжать захват до последнего найденного фрукта.
Ниже я просто затем использую new RegExp
для построения вышеприведенного регулярного выражения.
Тогда, потому что я используюГлобальный флаг, который я могу пройти через все найденные термины и суммы.
пс.Для этого не требуются начальные и конечные биты, но вы можете добавить их, если действительно необходимо.
const fruits = ["apple","orange","kiwi","banana"];
const string = 'I want to <start> eat 6 slices of apples <end> in the morning and <start> 1 orange in the evening <end> and <start> 4 more slices of apple before bed <end>'
const find = new RegExp(`(\\d).*?(${fruits.join("|")})`, "g"); //build the regular expression
const sums = {}; //somewhere to store our sums.
while (true) {
const f = find.exec(string);
if (!f) break; //no more found
const [_, qty, fruit] = f;
sums[fruit] = (sums[fruit] | 0) + (qty | 0); //sum the results.
}
console.log(sums);