Как мне использовать регулярное выражение для выбора следующих значений цен?

#javascript #regex

#javascript #регулярное выражение

Вопрос:

У меня есть сценарий, в котором я пытаюсь выбрать значения цен в рупиях из строк в Javascript следующим образом

 The price was Rs.1000
The price was Rs 1000
The price was Rs.1000 - 5000
The price was Rs.1000 - Rs.5000
The price was Rs.50,000
The price was Rs 1,25,000 - Rs 2,45,000
  

Теперь очевидно, что, учитывая входные данные с таким большим разнообразием, не стоит создавать одно очень длинное громоздкое выражение регулярного выражения.
В настоящее время я разделил эту задачу на 4 части
Часть 1
// Извлекает все Rs.1000 или Rs 1000

 var regex = new RegExp(/brsW*?(d{1,7})b(?![,d])/i)
  

Часть 2
// Извлекает все Rs.1000-2000 или Rs 1000-2000 и любые их комбинации

 regex = new RegExp(/brsW*?(d{1,7})b(?![,d])s*?(?:-|to)s*?(?:brsbW*?)?(d{1,7})b(?![,d])/i)
  

Мне нужно зафиксировать значения валют, такие как 1000 и 2000, чтобы сохранить и обработать их.

Сразу несколько вопросов: мой массив в JS содержит около 3000 элементов. Я застрял на частях 3 и 4, которые включают запятые. Это правильный способ сделать это. Как мне получить значения в 1 такте, где присутствуют запятые

Это регулярное выражение, похоже, фиксирует как обычные числа, так и числа с запятыми, и поскольку я просто хочу числовые значения, а не иметь ничего общего с тем, где расставлены запятые, brs W *?d.,?. d b Я пытаюсь сделать один шаг вперед над этим выражениемтакже включать 1000-2000 типов. Есть идеи?

Комментарии:

1. Вам нужны только цифры или также строка «Rs»?

2. Попробуйте brsW*?(d{1,7}(?:,d )*)b(?:s*?(?:-|to)s*?(?:brsbW*?)?(d{1,7}(?:,d )*)b)?

3. Я не понимаю, почему The price was dummytestRs 1,25,000 - Rs 2,45,000 не следует сопоставлять. Невозможно не сопоставить его. Это сделает регулярное выражение огромным

4. Вот регулярное выражение, которое я имел в виду, и скрипка JS

5. Извините, в моей предыдущей скрипке была ошибка — см. Обновленный JSfiddle . Цены с Rs, которые являются частью слова, сопоставляются, но не фиксируются, поэтому мы их опускаем.

Ответ №1:

Вы можете использовать регулярное выражение для этой задачи — у вас есть обычный шаблон, используемый для поиска повторяющихся шаблонов в обычном тексте, просто создайте шаблон динамически. Есть 2 основных блока, один из которых будет соответствовать ценам, привязанным к другим словам (чтобы мы могли пропустить этот текст), а другой будет фиксировать цены только в допустимых контекстах.

Все регулярное выражение выглядит уродливым и длинным:

 /BrsW*(?:d{1,7}(?:,d )*)b(?:s*(?:-|to)s*(?:brsbW*?)?(?:d{1,7}(?:,d )*)b)?|brsW*(d{1,7}(?:,d )*)b(?:s*(?:-|to)s*(?:brsbW*?)?(d{1,7}(?:,d )*)b)?/gi
  

Однако ясно, что он состоит из простых и легко редактируемых строительных блоков:

  • (\d{1,7}(?:,\d )*)\b — числовая часть
  • rs\W*${num}(?:\s*(?:-|to)\s*(?:\brs\b\W*?)?${num})? — часть цены

ОБРАТИТЕ внимание, что группы захвата не захватываются с .replace(/((?!?:)/g, '(?:') помощью further в конструкторе регулярных выражений.

Смотрите демонстрацию JS:

 const num = "(\d{1,7}(?:,\d )*)\b";
const block = `rs\W*${num}(?:\s*(?:-|to)\s*(?:\brs\b\W*?)?${num})?`;
const regex = RegExp(`\B${block.replace(/((?!?:)/g, '(?:')}|\b${block}`, 'ig');
const str = `The price was Rs.1000
    The price was Rs 1000
    The price was Rs.1000 - 5000
    The price was Rs.1000 - Rs.5000
    The price was Rs.50,000
    The price was Rs 1,25,000 - Rs 2,45,000
    The price was dummytestRs 1,2665,000 - Rs 2,45,000`;
let m;
let result = [];
while ((m = regex.exec(str)) !== null) {
  if (m[2]) {
    result.push([m[1].replace(/,/g, ''), m[2]]);
  } else if (m[1]) {
    result.push([m[1].replace(/,/g, ''), ""]);
  }
}
document.body.innerHTML = "<pre>"   JSON.stringify(result, 0, 4)   "</pre>";