如何将字符串中的变量更改为Map

时间:2017-04-19 14:04:16

标签: groovy

我让我们说一个字符串中的100个变量,我的要求是从字符串中自动创建Map

String str = "$$test$$ $$test2$$ $$test$$ $$test3$$"  

预期结果:

["test":test, "test2":test2, "test3":test3];

编辑(对于dsharew) 这是我的代码的最后一个版本

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

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

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

日志打印出以下结果:

$$test$$
test
$$test2$$
test2
$$test$$
test
$$test3$$
test3
[$$test$$, $$test2$$, $$test$$, $$test3$$]
{test=test, test2=test2, test3=test3}
test test2 test test3

3 个答案:

答案 0 :(得分:1)

这应该做你想要的:

import Tkinter as tk
from PIL import ImageTk
from io import BytesIO
from urllib import urlopen

root = tk.Tk()
canvas = tk.Canvas(root, width=300, height=300)
canvas.pack()

canvas.create_text(150, 150, text="word word word word word word word word")
url = "https://www.dropbox.com/s/etqan5h62d14mv8/Pikachu-PNG-Photos.png?dl=1"
img = ImageTk.PhotoImage(file=BytesIO(urlopen(url).read()))
canvas.create_image(150, 150, image=img)

root.mainloop()

答案 1 :(得分:1)

按照@dsharew的回答,我把它减少了一点:

​def queryText = "\$\$test\$\$ \$\$test2\$\$ \$\$test\$\$ \$\$test3\$\$"    

def resultMap = queryText
  .findAll(/\$\$(.*?)\$\$/)
  .collectEntries { String next ->         
    [next.replace("\$\$", "")] * 2                    
  } 
  • collectEntries可用于从集合中返回地图,如果它为集合中的每个条目返回地图或元组。

  • 如果您将列表乘以n,则表示您创建了一个更大的列表,其内容为n

BTW很酷的问题!

答案 2 :(得分:0)

这就是我想出来的

String str = '$$test$$ $$test2$$ $$test$$ $$test3$$'
str.replaceAll('\\$\\$', '').split(' ').collectEntries { [(it):it] }