如何使用Scala函数通过正则表达式匹配错误信息并返回指定结果
Scala正则匹配函数问题解决
问题梳理
需求是实现一个Scala函数,接收错误信息字符串,匹配预设正则表达式后返回指定错误信息或None。当前遇到两个问题:
- 明明
exReg.findFirstIn(exMess)能匹配到结果,但match语句始终返回None,IDE无报错 - 尝试在
match分支中直接调用exReg.findFirstIn(exMess)作为匹配模式,语法不支持
错误原因分析
1. 正则表达式本身存在问题
代码里有两处正则错误:
- 字符组写法错误:
[R,I,N]会将逗号也作为待匹配的字符,而实际想匹配R/I/N中的任意一个,应该写成[RIN] - 前缀不匹配:测试输入
exMess是parseR.TokenException: at line 1,但正则用的是parser[R,I,N](多了一个r),导致开头就匹配失败
2. Match模式写法错误
case exReg(_)的写法要求正则表达式包含捕获组,但你的正则没有定义捕获组,所以这种模式永远不会匹配成功。
3. 非法的模式语法
case exReg.findFirstIn(exMess) =>不符合Scala模式匹配规则:模式分支必须是稳定的标识符、字面量、构造器模式等,不能直接用方法调用的动态结果作为匹配模式。
修正后的代码
val exMess = "parseR.TokenException: at line 1" def exceptionBasicRow(exMess: String): Option[String] = { // 修正正则:调整前缀为parse,字符组改为[RIN] val exReg: Regex = "parse[RIN].TokenException: at line 1".r val exReg2: Regex = "parse[RIN].ParseException: at line 1".r val exReg3: Regex = "parse[RIN].SomeOtherException: at line 1".r // 修正重复的正则 exMess match { // 无捕获组的正则用()匹配整个字符串 case exReg() => Some("There is a TokenException error") case exReg2() => Some("There is a ParseException error") case exReg3() => Some("There is a OtherException error") case _ => None } } // 测试输出:Some(There is a TokenException error) println(exceptionBasicRow(exMess))
替代写法(守卫模式)
如果不想依赖正则的完整匹配模式,可以用守卫模式判断是否匹配:
def exceptionBasicRow(exMess: String): Option[String] = { val exReg: Regex = "parse[RIN].TokenException: at line 1".r val exReg2: Regex = "parse[RIN].ParseException: at line 1".r exMess match { case s if exReg.findFirstIn(s).nonEmpty => Some("TokenException error") case s if exReg2.findFirstIn(s).nonEmpty => Some("ParseException error") case _ => None } }
内容的提问来源于stack exchange,提问作者user8675309
相关产品推荐
相关产品推荐

