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

Scala Anorm正则匹配无结果,同SQL在MySQL可正常运行

问题描述

使用Scala 2.11和Play Framework 2.3,尝试通过Anorm执行带正则表达式匹配的查询,代码如下:

def resultsfunc() = {

   val gradeRegex = "^Class 5\."
   val currRegex = "\.NCERT$"

   DB.withConnection{ implicit c =>
     val filterQuery = SQL(
      """
        select * from tbl_graphs
        where graph_name REGEXP '{grade_regex}' and
        graph_name REGEXP '{curr_regex}' and org_id = 4
      """
      ).on("grade_regex" -> gradeRegex,
          "curr_regex" -> currRegex)

    filterQuery().map{ graphRecord =>
        
        new ResultObj(graphRecord[Long]("id"),
                    graphRecord[String]("name"))

       }.toList
    }
}

无报错但返回空结果,数据库中存在多条符合匹配规则的记录,且相同查询在MySQL Workbench中可正常运行,打印filterQuery也显示参数映射正确。请问在Scala Anorm中进行正则表达式匹配是否需要采用不同方式?

解决方法

问题出在Scala字符串的转义处理上,和Anorm的正则匹配逻辑无关。

在Scala里,反斜杠\是转义字符,你写的"\."会被Scala解析成单个.——但MySQL的REGEXP语法中,.是匹配任意字符的通配符,不是字面意义上的点。这就导致你的正则表达式和预期不符,自然查不到结果。

要让MySQL接收到匹配字面量点的\.,你需要在Scala字符串里用双反斜杠\\转义:

val gradeRegex = "^Class 5\\." // 实际传给MySQL的是 ^Class 5\.
val currRegex = "\\.NCERT$"   // 实际传给MySQL的是 \.NCERT$

你也可以用Scala的原始字符串(用"""包裹)来避免手动转义,写法更简洁直观:

val gradeRegex = """^Class 5\."""
val currRegex = """\.NCERT$"""

原始字符串里的反斜杠不会被Scala转义,会直接传递给MySQL,效果和双反斜杠写法一致。

修改后,参数化的正则表达式就和你在MySQL Workbench中写的完全一致,就能正确匹配到目标记录了。

内容的提问来源于stack exchange,提问作者Maniyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:40:41