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

