2017-04-20 1 views
2

J'ai fait quelques recherches mais je n'ai pas trouvé de code fonctionnel pour mon cas. J'ai deux variables du nom test et test2 et je veux les mettre dans une carte au format [test:valueof(test), test2:valueof(test2)]Accéder à la valeur de la variable par son nom comme String (groovy)

Mon morceau de code est le suivant:

def test="HELLO" 
def test2="WORLD" 
def queryText = "\$\$test\$\$ \$\$test2\$\$ this is my test" 

def list = queryText.findAll(/\$\$(.*?)\$\$/) 

def map = [:] 
list.each{ 
    it = it.replace("\$\$", "") 
    map.putAt(it, it) 
} 

queryText = queryText.replaceAll(/\$\$(.*?)\$\$/) { k -> map[k[1]] ?: k[0] } 

System.out.println(map) 
System.out.println(queryText) 

Sortie:

output

Sortie souhaitée:

"HELLO WORLD this is my test" 

Je pense que je besoin de quelque chose comme map.putAt(it, eval(it))

EDIT

C'est la façon dont je reçois mes entrées. le code va dans le script 'test'

Ceux à droite sont les noms de variables dans le script, la colonne de gauche sont les valeurs (qui seront ensuite dynamiques)

enter image description here enter image description here

+0

GiLA3, avez-vous la chance de vérifier la solution? – Rao

+0

Quelles sont les données dans RTFTemplates et Message1? Votre script groovy actuel est-il dans 'test'? – Rao

+0

Les données dans les modèles RTF ne sont pas pertinentes, l'attribut 'query' est une chaîne avec' $$ placeholders $$ ', message1 est juste une boîte vide où je retournerai le résultat' queryText' traité par le script. Oui, le script est dans 'test' – GiLA3

Répondre

3

Vous y êtes presque.
La solution est de placer les valeurs dans des variables séparées et de les placer dans la liaison de script.

Ajouter ce au début (supprimer les variables test et test2):

def test="HELLO" 
def test2="WORLD" 
binding.setProperty('test', test)  
binding.setProperty('test2', test2) 

et changer ceci:

{ k -> map[k[1]] ?: k[0] } 

à ceci:

{ k -> evaluate(k[1]) } 
+0

Les variables sont déjà définies avant ce morceau de code, la partie 'def' devait être un exemple, mes variables sont récupérées comme suit:' #input String queryText, test, test2 'Depuis que j'utilise WebRatio. 'test' contient déjà' "HELLO" 'et' test2' contient déjà '" WORLD "', il en va de même pour 'queryText', donc est-il possible d'adapter' binding.setProperty' à ma situation? Quelque chose comme 'binding.setProperty ('test', test)' peut-être? – GiLA3

+0

bien sûr vous pouvez, mis à jour la solution – dsharew

+0

'{k -> evaluate (k [1])}' 'était tout ce dont j'avais besoin! "binding" n'est pas nécessaire dans mon cas, même si je ne comprends pas vraiment pourquoi. Merci beaucoup! – GiLA3

1

Il devrait Soyez très simple si vous pouviez utiliser TemplateEngine.

def text = '$test $test2 this is my test' 
def binding = [test:'HELLO', test2:'WORLD'] 
def engine = new groovy.text.SimpleTemplateEngine() 
def template = engine.createTemplate(text).make(binding) 
def result = 'HELLO WORLD this is my test' 
assert result == template.toString() 

Vous pouvez tester rapidement en ligne Demo

+0

Dans mon exigence, je dois utiliser mes noms de variables à la place de '' HELLO '' et '' WORLD'' car ces valeurs changent à chaque exécution du code. J'ai besoin de quelque chose comme 'def binding = [test: valeur de (test), test2: valeur de (test2)]' – GiLA3

+0

Quelle est l'entrée exacte que vous recevez?certains où il devrait y avoir un mappage/liaison de variable et sa valeur, non? – Rao

+0

Edité ma question avec les informations demandées :) – GiLA3

1

Code de travail final , merci à tous, en particulier à Dsharew qui m'a aidé un beaucoup!

#input String queryText,test,test2,test3 

def list = queryText.findAll(/\$\$(.*?)\$\$/) 

def map = [:] 
list.each{ 
    it = it.replace("\$\$", "") 
    map.putAt(it, it) 
} 

queryText = queryText.replaceAll(/\$\$(.*?)\$\$/) { k -> evaluate(k[1]) } 

return queryText