You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中如何在模式匹配中内联正则表达式?

Scala中实现正则表达式内联模式匹配的正确方式

问题背景

我已经知道可以用带捕获组的正则表达式进行模式匹配,示例代码如下:

val re = """a(\d)""".r
"a5" match {
  case re(x) => println(x)
  case _ => println("Oops")
}

运行结果输出 5。

但尝试将正则表达式内联到模式匹配语句中时出现错误,错误代码如下:

"a5" match {
  case """a(\d)"""".r(x) => println(x)
  case _ => println("Oops")
}

报错信息:

case """a(\d)"""".r(x) => println(x)
                ^
On line 2: error: '=>' expected but '.' found.

解决方案

你遇到的问题是字符串语法错误——多写了一个多余的双引号。正确的内联写法只需要去掉多余的引号,直接将正则字符串的.r提取器写在case中即可:

"a5" match {
  case """a(\d)""".r(x) => println(x)
  case _ => println("Oops")
}

这段代码运行后会正常输出 5,和预先定义正则变量的效果完全一致。

原理说明

  • """a(\d)""" 是Scala的三重引号字符串,无需转义反斜杠这类特殊字符;
  • 调用.r方法会生成Regex实例,而Regex类实现了Scala模式匹配所需的提取器(unapply方法),因此可以直接在case中捕获正则分组的内容。

进阶写法

如果正则表达式逻辑更复杂,或者需要明确优先级,可以用括号包裹正则实例,写法更清晰:

"a123" match {
  case ( """a(\d+)""".r )(num) => println(s"捕获到数字:$num")
  case _ => println("匹配失败")
}

内容的提问来源于stack exchange,提问作者Kombajn zbożowy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 19:35:25