了解Scala代码

时间:2017-09-29 19:22:32

标签: regex scala

我正在学习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")
    }
  })
}

1 个答案:

答案 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的replacergroup()是一种从Match参数中检索命名组的方法。 "value"是分配给正则表达式模式中两个捕获组之一的标签。

因此:

  1. 使用正则表达式解析输入sqlStr。捕获感兴趣的子字符串并标记它"值"。
  2. 检索标有"值"的字符串;并用它来索引vars地图。
  3. replaceAllIn将替换标记为" value"的子字符串。使用从vars地图检索到的字符串。