Java / scala正则表达式模式不是替换字符串

时间:2018-02-07 15:52:48

标签: java regex scala

我的输入如下。

 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检测为一个组,但不会在源中被替换。

2 个答案:

答案 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)))