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
相关产品推荐
相关产品推荐

