替换Groovy中现有字符串中的字符串

时间:2017-10-11 01:50:02

标签: java regex groovy

你最好如何"截断" Groovy / Java中的以下变量?

def p = '{"name" : "%token%", "lastName" : "%c%e", "addrMngr" : "%xyz", "postCode" : "%x"}'

换句话说,我怎么能一般地来自:

def p = '{"name" : "%token%", "lastName" : "%c%e", "addrMngr" : "%xyz", "postCode" : "%x"}'

def p = '{"name" : "", "lastName" : "", "addrMngr" : "", "postCode" : ""}'

忽略"值"中%的使用上面的列表,以及将来,随着更多数据,这个字符串可能会变大。

3 个答案:

答案 0 :(得分:1)

我认为OP的字符串实际上是json

您可以使用JsonSlurper将其转换回字符串。

def p = '{"name" : "%token%", "lastName" : "%c%e", "addrMngr" : "%xyz", "postCode" : "%x"}'
def json = new groovy.json.JsonSlurper().parseText(p)
json.keySet().collect{json."$it" = ''}
def result = groovy.json.JsonOutput.toJson(json)
println "Resultant after transformation: $result"
assert result instanceof String

答案 1 :(得分:0)

我会用正则表达式尝试:

p.replaceAll("\" : \".*\", \"", "\" : \"\", \"");

这是一个开始。 也可以使用正则表达式,例如,使空格可选。

答案 2 :(得分:0)

原始p非常接近Groovy中的地图语法;稍微改变一下,我们可以将它评估成一个真实的地图(LinkedHashMap,不能少,重新:关键顺序)。

假设性能不重要,请考虑以下(无正则表达式):

def p = '{"name" : "%token%", "lastName" : "%c%e", "addrMngr" : "%xyz", "postCode" : "%x"}'

def m = p.replace('{','[').replace('}',']')
def map = evaluate(m)

def buffer = new StringBuilder()
buffer.append("{")

map.eachWithIndex { key, val, index ->
    buffer.append(/"${key}" : ""/)
    if (index < map.keySet().size() - 1) {
        buffer.append(', ')
    }
} 

buffer.append("}")

def p2 = '{"name" : "", "lastName" : "", "addrMngr" : "", "postCode" : ""}'

assert p2 == buffer.toString()