我有一个场景,我试图从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种类型。有什么想法吗?
答案 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;