如何使用正则从JS字符串中提取米、千米数值并完成单位转换替换
问题说明
需要实现字符串内公制距离(米m、千米km)到英里的自动转换替换,现有代码仅能无差别提取所有数字,无法关联数字对应的单位,无法完成按单位的换算替换。
现有待调试代码:
let stringText = "Please continue for 290 m. And then take left and continue for 1.2 km."; console.log(stringText); let mtr_pattern = ""; let kn_pattern = ""; let numArr = stringText.match(/\d+\.\d+|\d+\b|\d+(?=\w)/g) || []); numArr = numArr.filter(n => n != '.'); console.log("numArry", numArr);
预期输出效果:
Please continue for 0.18 miles. And then take left and continue for 0.74 miles.
实现思路
- 编写正则时需要同时捕获数值部分和紧跟在数值后的单位(m/km),避免单独提取数字导致单位和数值错位
- 换算规则固定:1米约等于0.000621371英里,1千米约等于0.621371英里,换算结果保留2位小数即可匹配预期输出
- 直接用
String.replace方法做匹配替换,不需要单独提取数字再二次遍历匹配,逻辑更简洁
可运行实现代码
let stringText = "Please continue for 290 m. And then take left and continue for 1.2 km."; // 正则匹配数值+对应单位,全局替换 const convertedText = stringText.replace(/(\d+\.?\d*)\s*(km|m)\b/g, (match, numStr, unit) => { const num = parseFloat(numStr); const miles = unit === 'km' ? num * 0.621371 : num * 0.000621371; // 保留2位小数,拼接英里单位 return `${miles.toFixed(2)} miles`; }); console.log(convertedText); // 输出:Please continue for 0.18 miles. And then take left and continue for 0.74 miles.
匹配正则说明
用到的核心匹配模式/(\d+\.?\d*)\s*(km|m)\b/g各部分作用:
(\d+\.?\d*):捕获整数、带小数的数值,兼容整数(如290)和小数(如1.2)两种格式\s*:匹配数值和单位之间的任意个空白字符,兼容有没有空格的写法(比如290m、1.2 km都能正常匹配)(km|m):捕获单位,注意把km写在m前面,避免正则优先匹配到m把km单位拆错\b:单词边界,避免匹配到其他以m开头的单词(比如mother里的m不会被误识别为长度单位)g:全局匹配标识,会替换字符串里所有符合规则的距离值
内容的提问来源于stack exchange,提问作者dhananjay_shingote
相关产品推荐
相关产品推荐

