使用Groovy一行代码缩进多行字符串

5

我想要在Groovy中缩进一个多行字符串,但是我无法找到正确的正则表达式语法或正则表达式标志来实现这一点。

到目前为止,这是我尝试过的:

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

由于某些原因,这些并没有按预期工作。
唯一有效的是以下代码块:
def indented = ""
s.eachLine {
  indented = indented + "      " +  it + "\n"
}
println indented

有没有更短/更高效的方法在Groovy中缩进字符串的所有行?
3个回答

5

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

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

2

你可以分割和合并 - 不知道它是否更有效率,但更简洁

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

1
或者使用 Java 中的 replace 函数,它是非正则表达式且可能更快的方法:
def s="""\
This
is
multiline
"""

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

它会打印:

    This
    is
    multiline

注意:对于那些挑剔的人,需要替换使用java的正则表达式实现(如Pattern),而是一个LITERAL正则表达式,这意味着它将忽略所有普通的正则表达式转义等。因此,对于大字符串来说,上述方法可能仍然比split更快,但这让你希望他们留下一些函数,只需执行没有潜在缓慢的Pattern实现的替换操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接