JavaScript Regex для поиска UOM в строке - PullRequest
1 голос
/ 20 апреля 2020

У меня есть список продуктов, который содержит UOM в названии продукта. Необходимо автоматически определить UOM в заголовке с помощью Regex.

Ожидания

  • Банановый йогурт 70 мл returns ml
  • Fi sh Наггетсы 200G returns g
  • Картофель Клинья 200 G returns g

У меня есть эта функция ниже

detectMetricUnit = (title) => {
        let unit,
            regex = new RegExp(/(?:\d)/mg),
            measurement = title.match(regex) && title.match(regex)[0],
            matches = measurement && title.split(measurement)[1];

        if(matches) {
            if(/millilitre|milliliter|ml/.test(matches.toLowerCase())){
                unit = 'ml';
            } else if(/litre|liter|l/.test(matches.toLowerCase())){
                unit = 'l';
            } else if (/kilogram|kg/.test(matches.toLowerCase())) {
                unit = 'kg';
            } else if (/gram|g/.test(matches.toLowerCase())) {
                unit = 'g';
            }
        }

        return unit;
    }

Однако у меня есть некоторые проблемные строки c, такие как

  • Chocolate Напиток 330 мл X 24 matches 3 and return null UOM, который я ожидаю получить ml.

Благодарю, если кто-то может указать на мою ошибку в моем регулярном выражении. Как я могу получить полные целые числа и найти UOM рядом с ним даже с пробелом?

1 Ответ

1 голос
/ 20 апреля 2020

Вы можете определить словарь возможных UOM, которые вы хотите обнаружить, и затем построить регулярное выражение, подобное

/(\d+(?:\.\d+)?)\s?(millilitre|milliliter|ml|litre|liter|l|kilogram|kg|gram|g)\b/i

См. Демонстрационную версию regex . Часть (\d+(?:\.\d+)?) захватит целое число или значение с плавающей запятой в Группу 1, затем \s? совпадет с необязательным пробелом (изменится на \s*, чтобы соответствовать 0 или более пробелам), а затем (millilitre|milliliter|ml|litre|liter|l|kilogram|kg|gram|g)\b захватит единицу UOM в Группу 2 как целое слово (из-за \b границы слова).

Вот реализация JS для получения первой UOM из строки:

let strs = ['Banana Yogurt 70ml', 'Fish Nuggets 200G', 'Potato Wedges 200 G', 'Chocolate Drink 330ML X 24']
let dct = {millilitre: 'ml', milliliter: 'ml', ml: 'ml', litre:'l', liter: 'l', l: 'l', kilogram: 'kg', kg: 'kg', gram: 'g', g: 'g'}

detectMetricUnit = (title) => {
        let unit, match, val,
            regex = new RegExp("(\\d+(?:\\.\\d+)?)\\s?(" + Object.keys(dct).join("|") + ")\\b", "i");
            match = title.match(regex);

        if (match) {
            val = match[1];
            unit = dct[match[2].toLowerCase()]
        }
        return [val, unit];
    }

strs.forEach(x => console.log(detectMetricUnit(x)) )

Чтобы получить их все, несколько раз:

let strs = ['Banana Yogurt 70ml and Fish Nuggets 200G', 'Potato Wedges 200 G and Chocolate Drink 330ML X 24']
let dct = {millilitre: 'ml', milliliter: 'ml', ml: 'ml', litre:'l', liter: 'l', l: 'l', kilogram: 'kg', kg: 'kg', gram: 'g', g: 'g'}

detectMetricUnit = (title) => {
        let match, results = [],
            regex = new RegExp("(\\d+(?:\\.\\d+)?)\\s?(" + Object.keys(dct).join("|") + ")\\b", "ig");
        
        while (match=regex.exec(title)) {
            results.push([ match[1], dct[match[2].toLowerCase()] ]);
        }
        return results;
    }

strs.forEach(x => console.log(x, detectMetricUnit(x)) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...