Groovy grep + 构建键值
Groovy grep + build key value
我有一个包含以下文本的变量:
blablablabla
blablablabla
blablablabla
messages: 30
name: muzi
blablablabla
blablablabla
blablablabla
messages: 20
name: puzi
blablablabla
blablablabla
blablablabla
.
.
.
我想做的是 grep 名字和消息(每次消息都与他后面出现的名字相关)
并在数据(交换机名称和消息)中设置它,例如键值对
所以我会
Data = [
"muzi": 30
"puzi": 20
]
等等。
这是我可以在 powershell 中轻松完成的事情,但我在 groovy 方面没有经验,如果有人能给我一些帮助,我很高兴。
def lines='''
blablablabla
blablablabla
blablablabla
messages: 30
name: muzi
blablablabla
blablablabla
blablablabla
messages: 20
name: puzi
blablablabla
blablablabla
blablablabla
messages: 11
name: puz
'''.readLines()
//Like this
def messages = lines.findAll{ it=~/^messages:\s+/ }.collect{ it.split(/:\s+/)[1] }
def names = lines.findAll{ it=~/^name:\s+/ }.collect{ it.split(/:\s+/)[1] }
def res = [names,messages].transpose().collectEntries()
println res
//OR like this:
res = lines.findAll{ it=~/^(messages|name):\s+/ }.collect{ it.split(/:\s+/)[1] }.collate(2).collectEntries{[it[1], it[0]]}
println res
您可以使用多行正则表达式,它强制两行连续。
查看字符串开头的负数据。
String txt = """
messages: 300
blablablabla
name: zeny
blablablabla
blablablabla
messages: 30
name: muzi
blablablabla
blablablabla
messages: 20
name: puzi
blablablabla
"""
def res = [:]
txt.findAll(/(?ms)^messages: (\d+)$.^name: (\w+)$/) {match, w1, w2 -> res[w2] = w1}
assert res == [muzi:'30', puzi:'20']
我有一个包含以下文本的变量:
blablablabla
blablablabla
blablablabla
messages: 30
name: muzi
blablablabla
blablablabla
blablablabla
messages: 20
name: puzi
blablablabla
blablablabla
blablablabla
.
.
.
我想做的是 grep 名字和消息(每次消息都与他后面出现的名字相关)
并在数据(交换机名称和消息)中设置它,例如键值对 所以我会
Data = [
"muzi": 30
"puzi": 20
]
等等。 这是我可以在 powershell 中轻松完成的事情,但我在 groovy 方面没有经验,如果有人能给我一些帮助,我很高兴。
def lines='''
blablablabla
blablablabla
blablablabla
messages: 30
name: muzi
blablablabla
blablablabla
blablablabla
messages: 20
name: puzi
blablablabla
blablablabla
blablablabla
messages: 11
name: puz
'''.readLines()
//Like this
def messages = lines.findAll{ it=~/^messages:\s+/ }.collect{ it.split(/:\s+/)[1] }
def names = lines.findAll{ it=~/^name:\s+/ }.collect{ it.split(/:\s+/)[1] }
def res = [names,messages].transpose().collectEntries()
println res
//OR like this:
res = lines.findAll{ it=~/^(messages|name):\s+/ }.collect{ it.split(/:\s+/)[1] }.collate(2).collectEntries{[it[1], it[0]]}
println res
您可以使用多行正则表达式,它强制两行连续。 查看字符串开头的负数据。
String txt = """
messages: 300
blablablabla
name: zeny
blablablabla
blablablabla
messages: 30
name: muzi
blablablabla
blablablabla
messages: 20
name: puzi
blablablabla
"""
def res = [:]
txt.findAll(/(?ms)^messages: (\d+)$.^name: (\w+)$/) {match, w1, w2 -> res[w2] = w1}
assert res == [muzi:'30', puzi:'20']