Ответ 1
Обычно вы делаете это с помощью Groovy Шаблоны.
В настоящее время я сталкиваюсь с проблемой с переменной заменой в groovy. Хотя это довольно тривиально:
Map map = [s1:"Hello", s2:"World"]
println "${map.s1} ${map.s2}!" // "Hello World!"
Как это работает, я уверен, что что-то вроде этого тоже должно работать:
Map map = [s1:"Hello", s2:"World"]
def dynamic = loadStringFromFile();
println "${dynamic} ${dynamic.class}" // "${s1} ${s2}! (java.lang.String)"
// now the voodoo part
println applyVoodoo(dynamic, map) // "Hello World!"
Кто-нибудь знает, как заставить это работать?
Приветствия
Обычно вы делаете это с помощью Groovy Шаблоны.
dynamic.replaceAll(/\$\{(\w+)\}/) { m, k -> map[k] }
Если мы можем принять небольшую модификацию в переменных ссылках, я бы сделал это следующим образом:
Map map = [s1:"Hello", s2:"World"]
def dynamic = '${x.s1} ${x.s2}!' // Plain string
println "${dynamic} ${dynamic.class}" // "${x.s1} ${x.s2}! class java.lang.String"
// The voodoo part
println Eval.x(map, '"' + dynamic +'"') // Hello World!
Выражение "${x.s1} ${x.s2}!"
оценивается GString
с переменной интерполяцией. Это означает, что мы обладаем большей гибкостью с ссылками на переменные без сложности шаблонов Groovy.
dynamic = 'keys: ${x.values()}'
println Eval.x(map, '"' + dynamic +'"') // keys: [Hello, World]
Для подобной, но более общей проблемы, я попытался использовать SimpleTemplateEngine, но счел это расстраивающим, поскольку вы не можете избежать получения MissingPropertyException всякий раз, когда местозаполнитель не найден на вашей карте. Я закончил использовать эту обобщенную вариацию ответа sepp2k:
def s = '${s1} ${s2} $s{3}' // single quotes!
result = s.replaceAll(/\$\{(\w+)\}/) { k -> m[k[1]] ?: k[0] }
println result
который дает то, что я хотел:
"Hello World $s{3}"
Это работает, потому что replaceAll(/group/ { k ->
заполняет k
массивом: первый элемент - полное совпадение, а второй - группа. Итак, в моем случае, когда шаблон (без отмены символов) ${(+w)}
, тогда k[0]
- это полное совпадение: "${s1}"
и k[1]
совпадение группы "s1"
, поэтому
map[k[1]] = map["s1"] = "Hello"
и если map[k1]
null
, я использую elvis ?:
для sub в полном k0
, который является нерасширенной переменной, например ${s3}