首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串模式匹配的最佳实践

字符串模式匹配的最佳实践
EN

Stack Overflow用户
提问于 2011-10-09 02:19:59
回答 4查看 35.1K关注 0票数 30

下面是不起作用的代码,但它描述了我想要做的事情。

你能推荐一下解决这个问题的最佳方法吗?

代码语言:javascript
运行
复制
def resolveDriver(url: String) = {
  url match {
    case url.startsWith("jdbc:mysql:") => "com.mysql.jdbc.Driver"
    case url.startsWith("jdbc:postgresql:") => "org.postgresql.Driver"
    case url.startsWith("jdbc:h2:") => "org.h2.Driver"
    case url.startsWith("jdbc:hsqldb:") => "org.hsqldb.jdbcDriver"
    case _ => throw new IllegalArgumentException
  }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-09 02:42:45

在语法方面,您可以只修改一小部分case语句:

代码语言:javascript
运行
复制
case url if url.startsWith("jdbc:mysql:") => "com.mysql.jdbc.Driver"

这只是将值url绑定到模式表达式(也是url),并添加一个带有测试的保护表达式。这应该会使代码编译。

要让它更像scala,可以返回一个选项String

代码语言:javascript
运行
复制
def resolveDriver(url: String) = url match {
  case u if u.startsWith("jdbc:mysql:") => Some("com.mysql.jdbc.Driver")
  case u if u.startsWith("jdbc:postgresql:") => Some("org.postgresql.Driver")
  case _ => None
}

除非您想要管理异常。

票数 46
EN

Stack Overflow用户

发布于 2011-10-09 02:47:18

这是另一种方法。将所有映射存储在一个映射中,然后使用collectFirst方法查找匹配项。collectFirst的类型签名为:

代码语言:javascript
运行
复制
def TraversableOnce[A].collectFirst[B](pf: PartialFunction[A, B]): Option[B]

用法:

代码语言:javascript
运行
复制
scala> val urlMappings = Map("jdbc:mysql:" -> "com.mysql.jdbc.Driver", "jdbc:postgresql:" -> "org.postgresql.Driver")
urlMappings: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(jdbc:mysql: -> com.mysql.jdbc.Drive
r, jdbc:postgresql: -> org.postgresql.Driver)

scala> val url = "jdbc:mysql:somestuff"
url: java.lang.String = jdbc:mysql:somestuff

scala> urlMappings collectFirst { case(k, v) if url startsWith k => v }
res1: Option[java.lang.String] = Some(com.mysql.jdbc.Driver)
票数 11
EN

Stack Overflow用户

发布于 2019-04-07 03:39:00

启动Scala 2.13,可以通过unapplying a string interpolator模式匹配String%s

代码语言:javascript
运行
复制
val s"jdbc:$dialect:$rest" = "jdbc:mysql:whatever"
// dialect: String = "mysql"
// rest: String = "whatever"

然后,在我们的示例中,只需使用Map将提取的值( sql方言)映射到适当的驱动程序

代码语言:javascript
运行
复制
val drivers = Map(
  "postgresql" -> "org.postgresql.Driver",
  "mysql"      -> "com.mysql.jdbc.Driver",
  "h2"         -> "org.h2.Driver"
)
val driver = drivers(dialect)
// driver: String = "com.mysql.jdbc.Driver"

如果需要格式错误的输入,还可以使用match语句:

代码语言:javascript
运行
复制
"jdbc:postgresql:something" match {
  case s"jdbc:$dialect:$rest" => Some(dialect)
  case _                      => None
}
// Option[String] = Some("postgresql")
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7698815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档