我的输入如下。
val source = """ {
"tgtPartitionColumns" : "month_id="${month_id}"",
"splitByCol" : "${splitByCol}"
}"""
val inputArgsMap = Map("splitByCol"->"ID","month_id"->"Jan")
我的正则表达式替换功能如下
import scala.collection.mutable
import java.util.regex.Pattern
def replaceVariablesWithValues(expr: String, argsMap: Map[String, String]): String = {
val regex = "\\$\\{(\\w+)\\}"
val unPassedVariables = new mutable.ListBuffer[String]()
val pattern = Pattern.compile(regex)
val matcher = pattern.matcher(expr)
var replacedString: Option[String] = None
while (matcher.find) {
val key = matcher.group(1)
if (argsMap.contains(key)) {
replacedString = Some(expr.replace("${" + key + "}", argsMap(key)))
} else {
unPassedVariables += key
}
}
if (unPassedVariables.nonEmpty)
throw new IllegalStateException(s"No matching key found in input arguments for $unPassedVariables")
replacedString.getOrElse("")
}
它能够将month_id检测为一个组,但不会在源中被替换。
答案 0 :(得分:2)
正则表达式很好,你的循环中有一个错误,这可以解决它:
replacedString = Some(replacedString.getOrElse(expr).replace("${" + key + "}", argsMap(key)))
答案 1 :(得分:1)
在每场比赛中,您将重新使用原始字符串进行替换。因此,当month_id
被替换时,splitByCol
替换将丢失。你需要改变
replacedString = Some(expr.replace("${" + key + "}", argsMap(key)))
类似
replacedString = Some(replacedString.getOrElse(expr).replace("${" + key + "}", argsMap(key)))