使用Groovy onliner缩进多行字符串

时间:2017-02-01 11:43:11

标签: groovy

我想在Groovy中缩进多行字符串,但我无法找到正确的RegEx语法/或Regex标志来实现这一点。

这是我到目前为止所尝试的内容:

*** Variables ***
${json}         {"items":[{"name":"item1","status":{"id":1,"name":"opened"}},{"name":"item2","status":{"id":2,"name":"closed"}}]}
${json_path}    $.items[?(@.status.name="closed")].name
*** Test Cases ***
Get closed item
    ${names}=    Get Json Items    ${json}    ${json_path}
    Should be equal    ${names[0]}    item2

由于某种原因,这些没有按预期工作。

唯一有用的是这个块:

def s="""This
is
multiline
"""
println s.replaceAll('/(.*)/',"      \1")
println s.replaceAll('/^/',"     ")
println s.replaceAll('(?m)/^/',"      \1")
println s.replaceAll('(?m)/(.*)/',"      \1")

是否有更短/更有效的方法来缩进Groovy中字符串的所有行?

3 个答案:

答案 0 :(得分:1)

您需要将(?m)指令放在正则表达式中;并且模式是一个slashy字符串,而不是带有斜杠的单引号字符串:

s.replaceAll(/(?m)^/, "    ")

答案 1 :(得分:0)

你可以拆分和加入 - 不知道它是否更有效,但更短

def s="""This
is
multiline
"""
def indent = "      "
println indent + s.split("\\n").join("\n" + indent);

答案 2 :(得分:0)

或者也许只使用java中的替换函数,这是非正则表达式并且可能更快:

def s="""\
This
is
multiline
"""

println '    ' + s.replace('\n', '\n    ')

打印:

    This
    is
    multiline

注意:对于那些挑剔的人来说,替换使用java正则表达式实现(如Pattern),但LITERAL正则表达式意味着它会忽略所有正常的正则表达式转义等等。所以上面可能仍然比分割大字符串更快,但这使你希望他们在那里留下一些功能,只是做了替换,没有任何涉及可能缓慢的模式实现。