簡體   English   中英

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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM