#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>";