Поиск объема и количества предметов с помощью регулярных выражений - PullRequest
0 голосов
/ 06 января 2020

В настоящее время я создаю JavaScript веб-скребок для продуктового магазина, который обрабатывает название продукта, а затем возвращает количество элементов, объем и цену за литр продукта. Большинство названий продуктов выглядят примерно так:

Кока-кола (ванильный ароматизатор) 12 x 330 мл

Чтобы получить метаданные об этом продукте, у меня есть написал регулярное выражение. Будет выполнен поиск границы слова, за которой следует число 1 или 2 ди git, пробел, строка «x», другой пробел и, наконец, число 1, 2 или 3 ди git:

const filter = new RegExp(/\b\d{1,2}\sx\s\d{1,3}/);

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

  if (result.title.match(filter)) {
     result.itemCount = parseInt(result.title.match(/\d{1}\s/));
     result.itemVolume = parseInt(result.title.match(/\d{2,3}\s/));
     result.litreVolume = (result.itemCount * result.itemVolume) / 1000;
     result.pricePerLitre = +(result.price / result.litreVolume).toFixed(2);
  } else {
     result.itemCount = 1;
     result.itemVolume = parseInt(result.title.match(/\d{2,3}\s/));
     result.litreVolume = result.itemVolume / 1000;
     result.pricePerLitre = +(result.price / result.litreVolume).toFixed(2);
  }

90% результатов выглядят хорошо, но иногда я получаю неожиданные результаты. Например:

  • количество элементов NaN, что может быть связано с тем, что некоторые названия содержат еще несколько чисел ( Coca Cola (4-Way) 12 x 330 мл) )
  • объем Бесконечности
  • цена за литр, которая слишком высока

Очевидно, что я ошибаюсь с моим подходом к вычислению желаемого метаданные. Что было бы лучшим способом сделать расчеты с RegEx? Я что-то упустил, что сделало бы мои расчеты менее подверженными ошибкам?

1 Ответ

1 голос
/ 06 января 2020

Если я правильно понимаю, фильтр \b\d{1,2}\sx\s\d{1,3} работает, но ваши подчиненные фильтры не (\d{1}\s) ...

Я использовал только регулярное выражение в c#, но я видел, что вы могли использовать группы в java также. измените ваш шаблон на (\b\d{1,2})\sx\s(\d{1,3}). Когда вы ставите скобки в свое регулярное выражение, эта часть становится группой, к которой вы можете обратиться позже.

Как я уже говорил, я не использовал java в течение нескольких лет, но я выбрал этот фрагмент кода из веб. Он показывает, как использовать группы в java. В качестве шаблона вы должны использовать (\b\d{1,2})\sx\s(\d{1,3}). Если это то же самое, что и в c# группа (0) - это весь результат, группа (1) - ваша первая фактическая группа, группа (2) - вторая.

// Create a Pattern object
Pattern r = Pattern.compile(pattern);

// Now create matcher object.
Matcher m = r.matcher(line);

if (m.find( )) {
System.out.println("Found value: " + m.group(0) );
System.out.println("Found value: " + m.group(1) );
}

Я думаю, вы можете напишите его с меньшим количеством кода, чем указано выше, но вы получите картинку; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...