如何使用正则表达式选择以下价格值?

时间:2016-10-07 17:20:02

标签: javascript regex

我有一个场景,我试图从Javascript中的字符串中选择Rs中的价格值,如下所示

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(/\brs\W*?(\d{1,7})\b(?![,\d])/i)

第2部分 //提取所有Rs.1000 - 2000或Rs 1000 - Rs 2000及其任何组合

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

我需要捕获1000和2000等货币值来存储和处理它。

有几个问题,JS中的数组有大约3000个项目。我被困在第3和第4部分,涉及逗号。这是正确的方法吗? 如何在存在逗号的1个笔划中获取值

这个正则表达式似乎用逗号捕获正常数字和数字,因为我只想要数字值而不是与放置逗号的位置有任何关系, \ BRS \ W *?\ d ,? \ d \ b 我试图在这个表达式上向前迈出一步,包括1000 - 2000种类型。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您可以使用正则表达式执行此任务 - 您可以使用常规模式在纯文本中查找重复的模式,只需动态创建模式。有两个主要块,一个匹配粘贴到其他单词的价格(这样我们可以跳过该文本),另一个将仅在有效的上下文中捕获价格。

whole regex看起来很丑陋而且很长:

/\Brs\W*(?:\d{1,7}(?:,\d+)*)\b(?:\s*(?:-|to)\s*(?:\brs\b\W*?)?(?:\d{1,7}(?:,\d+)*)\b)?|\brs\W*(\d{1,7}(?:,\d+)*)\b(?:\s*(?:-|to)\s*(?:\brs\b\W*?)?(\d{1,7}(?:,\d+)*)\b)?/gi

然而,很明显它包含简单且易于编辑的构建块:

  • (\\d{1,7}(?:,\\d+)*)\\b - 数字部分
  • rs\\W*${num}(?:\\s*(?:-|to)\\s*(?:\\brs\\b\\W*?)?${num})? - 价格部分

请注意,在RegExp构造函数中,捕获组将使用.replace(/\((?!\?:)/g, '(?:')进行非捕获。

参见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>";
&#13;
&#13;
&#13;