2017-02-01 1 views
1

Ich möchte eine mehrzeilige Saite in Groovy einrücken, aber ich kann die richtige RegEx-Syntax/Regex-Flags nicht herausfinden, um das zu erreichen.Mehrzeilige Saite mit Groovy Onliner einrücken

Hier ist, was ich bisher versucht:

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

Diese aus irgendeinem Grunde nicht wie erwartet funktionieren.

Das einzige, was so gearbeitet ist dieser Block:

def indented = "" 
s.eachLine { 
    indented = indented + "  " + it + "\n" 
} 
println indented 

Gibt es einen kürzeren/effizienten Weg, um alle Zeilen einen Strings in Groovy einrücken?

Antwort

0

könnten Sie teilen und verbinden - weiß nicht, ob es effizienter ist, aber kürzer

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

Oder vielleicht nur die Ersetzen-Funktion von Java verwendet, die ohne reguläre Ausdrücke ist und möglicherweise schneller:

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

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

, die Drucke:

This 
    is 
    multiline 

Anmerkung: für diejenigen, die wählerisch genug sind, ersetzen tut Verwenden Sie die Java-Regex-Implementierung (wie in Pattern), aber eine LITERAL Regex was bedeutet, dass es alle normalen Regex Escapes usw. ignoriert. Also das oben genannte ist wahrscheinlich immer noch schneller als Split für große Strings, aber das macht Sie wünschen sie hatten hat dort eine Funktion hinterlassen, die nur eine Ersetzung ohne Beteiligung der potentiell langsamen Musterimplementierung vorgenommen hat.

1

Sie müssen die (?m) Direktive in den regulären Ausdruck setzen; und das Muster ist eine slashy Zeichenkette, nicht eine einzelne in Anführungszeichen gesetzte Zeichenkette mit Schrägstrichen innerhalb:

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