Подтвердить что ты не робот

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!"

Кто-нибудь знает, как заставить это работать?

Приветствия

4b9b3361

Ответ 2

dynamic.replaceAll(/\$\{(\w+)\}/) { m, k -> map[k] }

Ответ 3

Если мы можем принять небольшую модификацию в переменных ссылках, я бы сделал это следующим образом:

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]

Ответ 4

Для подобной, но более общей проблемы, я попытался использовать 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}