You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用正则从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:51:22