我正在学习Scala。
有人可以解释一下这段代码吗? 我想了解,但不能......
def resolveDollarVar(sqlStr: String, vars: Map[String, String]): String = {
val varPattern = new scala.util.matching.Regex("""(\$\{(\S+?)\})""", "fullVar", "value")
varPattern replaceAllIn (sqlStr, m => {
try {
vars(m.group("value"))
}
catch {
case e: NoSuchElementException => throw new NoSuchElementException("Error: " + m.group("fullVar") + " cannot be resolved")
}
})
}
答案 0 :(得分:1)
快速访问the relevant scaladoc page会发现以下内容:
def replaceAllIn(target: CharSequence, replacer: (Match) ⇒ String): String
使用替换器功能替换所有匹配项。替换器功能 采用scala.util.matching.Regex.Match以获得额外信息 从比赛中获得。例如:
import scala.util.matching.Regex
val datePattern = new Regex("""(\d\d\d\d)-(\d\d)-(\d\d)""", "year", "month", "day")
val text = "From 2011-07-15 to 2011-07-17"
val repl = datePattern replaceAllIn (text, m => s"${m group "month"}/${m group "day"}")
在替换字符串中,后跟一个数字的美元符号($)将是 被解释为对匹配模式中的组的引用,带有数字 对应于前九组的1到9,和0代表 整场比赛。任何其他字符都是错误的。反斜杠(\)字符 将被解释为转义字符,可以用来逃避 美元符号。使用Regex.quoteReplacement来转义这些字符。
所以m
是传递给Match
lambda的replacer
。 group()
是一种从Match
参数中检索命名组的方法。 "value"
是分配给正则表达式模式中两个捕获组之一的标签。
因此:
sqlStr
。捕获感兴趣的子字符串并标记它"值"。vars
地图。replaceAllIn
将替换标记为" value"的子字符串。使用从vars
地图检索到的字符串。