如何在JavaScript中用lastIndexOf匹配多个运算符获取最后出现位置
问题原因
原来的写法result.lastIndexOf('+' || '-' || '/' || '*')中,||是逻辑或运算符,会直接返回第一个真值,四个运算符都是非空字符串,所以整个判断永远只会返回'+',相当于仅查找最后一个加号的位置,自然无法匹配其他运算符。
修复方案
方案1:分别计算各运算符的最后下标,取最大值
// 分别获取四个运算符的最后出现位置,无匹配时返回-1 const lastPlus = result.lastIndexOf('+') const lastMinus = result.lastIndexOf('-') const lastMultiply = result.lastIndexOf('*') const lastDivide = result.lastIndexOf('/') // 取最大值即为最后出现的运算符位置 const lastOperatorIndex = Math.max(lastPlus, lastMinus, lastMultiply, lastDivide) // 注意includes的第二个参数要从运算符的下一位开始查找,避免统计运算符前的小数点 if (val === "." && result.includes('.', lastOperatorIndex + 1)) { setResult(result) }
方案2:用正则直接匹配最后一个运算符的位置
// 正则匹配最后一个四则运算符,无匹配返回-1 const lastOperatorIndex = result.search(/[+\-*/](?=[^+\-*/]*$/) if (val === "." && result.includes('.', lastOperatorIndex + 1)) { setResult(result) }
边界兼容说明
两种方案都自动兼容无运算符的场景:如果表达式还没有任何运算符,lastOperatorIndex会返回-1,lastOperatorIndex + 1为0,相当于从整个表达式开头查找小数点,刚好符合「第一段数字不能有多个小数点」的需求,不需要额外做特殊判断。
内容的提问来源于stack exchange,提问作者Blistighast
相关产品推荐
相关产品推荐

