jQuery/JavaScript提取字符串RM前缀支付金额为无逗号数值数组的方法
完全可以通过正则实现,这是最适配该场景的方案
实现逻辑
- 首先通过正则规则精准定位所有RM货币前缀对应的金额片段,不受字符串原有排版、分隔符变动的影响
- 对匹配到的金额字符串移除所有千位逗号,转换为标准浮点数存入结果数组
核心匹配规则
使用如下正则表达式:
const amountReg = /(?<!\w)RM\s*([\d,]+?\.\d{2})/g;
各部分规则说明:
(?<!\w)负向后顾断言:确保RM前面不是字母、数字、下划线这类单词字符,避免误匹配TERM123.45这类本身包含RM子串的普通文本RM固定匹配马来西亚林吉特的货币前缀\s*匹配RM后面0个或多个空白字符,适配“RM9966.72”“RM 9966.72”这类格式变动的场景([\d,]+?\.\d{2})捕获组:非贪婪匹配数字、千位逗号的组合,直到识别到小数点加固定两位小数的金额结构- 全局修饰符
g:确保遍历匹配字符串中所有符合规则的内容,而非仅返回第一个匹配项小提示:
(?<!\w)属于ES2018引入的正则语法,目前所有主流浏览器、Node.js版本均已支持。如果需要兼容极老旧的运行环境,可以在匹配结果中额外判断RM前缀前的字符不是字母/数字/下划线即可,整体提取逻辑不受影响。
完整可运行代码
以你提供的付款条款字符串为例:
const paymentStr = `Payment terms: 50.00% - RM9,966.72 - (Before project start) 30.00% - RM5,580.03 - (Upon second review, 70% completion, before next 30% development start) 20.00% - RM3,386.69 - (Before deploy to PROD)`; // 方式1:兼容所有现代JS环境的循环写法 const amountList = []; const amountReg = /(?<!\w)RM\s*([\d,]+?\.\d{2})/g; let match; while ((match = amountReg.exec(paymentStr)) !== null) { // 移除所有千位逗号后转浮点数 const cleanAmount = parseFloat(match[1].replace(/,/g, '')); amountList.push(cleanAmount); } // 方式2:ES2020+环境支持的简洁写法 // const amountList = [...paymentStr.matchAll(/(?<!\w)RM\s*([\d,]+?\.\d{2})/g)] // .map(item => parseFloat(item[1].replace(/,/g, '')));
最终输出的结果数组为:[9966.72, 5580.03, 3386.69],完全符合输出要求。
鲁棒性说明
- 不依赖原字符串的固定分隔符(比如原文中的
-、括号、换行等),哪怕后续字符串排版变动,只要RM前缀、两位小数的金额结构不变,就能正确提取 - 自动清除金额中的所有千位逗号,最终输出无格式的纯十进制数值
- 整个实现基于JavaScript原生能力,不需要引入jQuery,不存在额外依赖
内容的提问来源于stack exchange,提问作者Tan Si Kai
相关产品推荐
相关产品推荐

