如何从字符串中提取整数范围?解决多位数及负数场景下的提取难题
提取字符串中的数值范围(支持正负、多位数)
嘿,这个场景用正则表达式来处理最省心了!你已经定位到了范围部分,接下来只需要用匹配数字的正则就能轻松提取出所有数值——不管是一位数、两位数还是负数都没问题。
情况1:已经拿到单个范围字符串
比如你已经通过substringBefore()/substringAfter()拿到了类似1..14或者-5..3这样的范围片段,直接用/-?\d+/g这个正则就能提取出里面的两个数值:
// 示例:处理x对应的范围字符串 const xRange = "1..14"; const xNumbers = xRange.match(/-?\d+/g); if (xNumbers) { const xMin = parseInt(xNumbers[0], 10); const xMax = parseInt(xNumbers[1], 10); console.log(`x的范围是 ${xMin} 到 ${xMax}`); // 输出:x的范围是 1 到 14 } // 测试负数范围 const negativeRange = "-7..-2"; const negativeNumbers = negativeRange.match(/-?\d+/g); if (negativeNumbers) { const min = parseInt(negativeNumbers[0], 10); const max = parseInt(negativeNumbers[1], 10); console.log(`范围是 ${min} 到 ${max}`); // 输出:范围是 -7 到 -2 }
这个正则的逻辑很简单:
-?:匹配可选的负号(处理负数)\d+:匹配一个或多个数字(覆盖一位数、两位数甚至更多位数)g:全局匹配,一次性找出片段里的所有数字
情况2:直接从原字符串提取所有变量和范围
如果你还没拆分出单个范围,也可以用一个更完整的正则直接从原字符串中提取所有变量对应的范围,一步到位:
const str = "some text x = 1..14, y = 2..4, z = -3..8 some text"; // 匹配「变量 = 数字..数字」的完整模式 const fullPattern = /(\w+) = (-?\d+)..(-?\d+)/g; let matchResult; // 遍历所有匹配结果 while ((matchResult = fullPattern.exec(str)) !== null) { const variableName = matchResult[1]; const rangeMin = parseInt(matchResult[2], 10); const rangeMax = parseInt(matchResult[3], 10); console.log(`${variableName} 的范围:${rangeMin} ~ ${rangeMax}`); }
运行后会输出:
x 的范围:1 ~ 14 y 的范围:2 ~ 4 z 的范围:-3 ~ 8
这个正则的各部分解析:
(\w+):捕获变量名(比如x、y、z)=:匹配固定的「空格+等于号+空格」格式(-?\d+):捕获范围的最小值(支持负数)..:匹配范围的分隔符(两个点)(-?\d+):捕获范围的最大值(支持负数)
扩展:支持小数范围
如果你的数值可能包含小数(比如1.5..3.2),只需要把正则里的\d+改成\d+(\.\d+)?即可,示例:
const decimalRange = "1.5..3.2"; const decimalNumbers = decimalRange.match(/-?\d+(\.\d+)?/g); if (decimalNumbers) { const min = parseFloat(decimalNumbers[0]); const max = parseFloat(decimalNumbers[1]); console.log(`小数范围:${min} 到 ${max}`); }
内容的提问来源于stack exchange,提问作者Abdul Alsabbagh
相关产品推荐
相关产品推荐

