Scala正则findAllIn在if子句中调用start抛出无匹配异常如何解决
报错原因
r.findAllIn(strName) 返回的是 Regex.MatchIterator 迭代器对象,必须先触发至少一次匹配动作(比如调用hasNext()、next())之后,才能调用start()方法获取匹配位置。
你单独在REPL环境执行两行代码不报错,是因为REPL打印变量mi信息的时候,会隐式触发迭代器的匹配检测;放到if块里运行时没有提前触发匹配,直接调用start()就会抛出无可用匹配的异常。
正确实现方案
方案1:修复原有写法
先调用hasNext()确认有匹配再取位置:
val r = "[0-9]".r val strName = "dkgngw3#ujhg" if (strName.exists(_.isDigit)) { val mi = r.findAllIn(strName) if (mi.hasNext) { val strNameTrim = strName.substring(0, mi.start) // 后续业务逻辑 } }
方案2:更简洁的正则实现(推荐)
直接用findFirstMatchIn获取第一个数字的匹配结果,不需要额外提前判断是否存在数字:
val r = "[0-9]".r val strName = "dkgngw3#ujhg" val strNameTrim = r.findFirstMatchIn(strName) match { case Some(mi) => strName.substring(0, mi.start) case None => strName // 无数字时返回原字符串,可根据需求调整返回值 }
方案3:不用正则的极简实现
直接调用字符串原生的indexWhere方法查找第一个数字的下标:
val strName = "dkgngw3#ujhg" val firstDigitIdx = strName.indexWhere(_.isDigit) val strNameTrim = if (firstDigitIdx >= 0) strName.substring(0, firstDigitIdx) else strName
内容的提问来源于stack exchange,提问作者davidzxc574
相关产品推荐
相关产品推荐

