Scala正则匹配HH:mm格式返回Any类型及打印异常问题求解
问题根因
- 类型推断异常:你将参数校验退出逻辑放在了
if分支的返回位置,dbutils.notebook.exit的返回类型为Unit,而else分支返回类型为Array[String],Scala会取两类的公共父类型Any作为整个表达式的返回值类型,因此scheduleHours实际类型为Any而非你预期的字符串数组,直接打印时会输出JVM对象的默认内存地址标识。 - 正则表达式规则错误:你写的
[0-30]?[0-9]是无效的字符组写法,字符组内[0-30]实际等价于[0123],会错误匹配30:00、39:59这类非法时间。
修复方案
先执行前置校验逻辑,确认参数非空后再赋值,保证整个赋值表达式的返回类型统一为
Array[String],同时修正正则规则。
// 先做前置非空校验 if (inputScheduleHours == "") { dbutils.notebook.exit(s"ERROR: Missing param value for schedule hours.") } val timePattern = """^((?:[01]?[0-9]|2[0-3]):[0-5][0-9])$""".r val inputScheduleHoursParsed = inputScheduleHours.split(";").map(_.trim) val scheduleHours = for (e <- inputScheduleHoursParsed) yield e match { case timePattern(e) => e case _ => dbutils.notebook.exit(s"ERROR: Wrong param value for schedule hours: '${inputScheduleHours}'") }
验证说明
修改后scheduleHours的类型会被正确推断为Array[String],直接使用println(scheduleHours.mkString("[", ", ", "]"))即可打印数组内容,不会再输出对象内存地址。
内容的提问来源于stack exchange,提问作者MarcinAu
相关产品推荐
相关产品推荐

