Отступ полосы в groovy многострочных строках
К сожалению stripIndent в многострочной строке не работает.
Боковое примечание: мои настройки стиля кода IDE допускают только отступы в пространстве (вкладки будут заменены пробелами). Но я думаю, что это не должно иметь значения.
def s = """ This
is
multiline
"""
println s.stripIndent()
не печатает
This
is
multiline
как ожидалось.
Выход с отступом.
This
is
multiline
Что здесь происходит?
Я использую Groovy 2.0.7 с Eclipse Indigo SR2.
Проблема, похоже, исчезает с использованием обратной косой черты (символ продолжения строки) в первой строке. Но я не понимаю, почему это необходимо.
Ответы
Ответ 1
Вы можете использовать .stripIndent()
, чтобы удалить отступ в многострочных строках. Но вы должны иметь в виду, что если не указывается количество отступов, оно будет автоматически определяться из строки, содержащей наименьшее количество ведущих пробелов.
Учитывая вашу строку, это будет только одно пробел перед This
, который будет удален из каждой строки вашей многострочной строки.
def s = """ This
is
multiline
"""
Чтобы обойти эту проблему, вы можете избежать первой строки многострочной строки, как показано в следующем примере, чтобы получить ожидаемый результат:
def s = """\
This
is
multiline
"""
Ответ 2
Также используйте .stripMargin() (если возможно).
def s = """ This
| is
| multiline
"""
println s.stripMargin().stripIndent()
Ответ 3
Для тех, у кого есть подобная проблема, решение stefanglase отлично подходит, но дает мне исключение MultipleCompilationErrorsException в тесте Спока при включении многострочной строки в утверждение, которое не выполняется:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Spec expression: 1: unexpected char: '\' @ line 1, column 16.
myString == '''\ This Is Multiline '''.stripIndent()
Мое решение это:
def myString = '''
This
Is
Multiline
'''.replaceFirst("\n","").stripIndent()
Теперь, когда утверждение не выполняется, вы увидите обычный diff, показывающий, что пошло не так, а не исключение компиляции.
Ответ 4
Вы намеревались использовать == вместо =? Единственные ошибки, которые я получаю, - это использовать ваш пример. если я изменю его на = и использую ваш пример без replaceFirst(), он отлично работает без ошибок.
Также вы не можете использовать a\при выполнении одной строки. Я могу дублировать вашу точную проблему, если я использую '' '\ This Is Multiline' ''.stripIndent()
Ответ 5
У меня есть аналогичный случай использования, потому что я хотел бы форматировать мой SQL-запрос в строке. Например, вложенный запрос:
String query = '''
select ${CONTROL_ID} from ${TABLE_NAME}
where
location_id = (
select id from location where code = ${locationCode}
)
''';
Выглядит намного лучше в Groovy, чем версия Java с "..."+ TABLE_NAME +"..."
, так как я уверен, что вы можете согласиться.
Этот тип строки не работает с методом .stripIndent()
. Вместо этого я сохранил новые строки в query
(выше) для какой-либо цели. Обратите внимание на "\" в конце строки.
И, таким образом,
String query = """
select ${CONTROL_ID} from ${TABLE_NAME}
where
location_id = (
select id from location where code = '${locationCode}'
)
""".replaceAll( /\n\s*/, " " );
println " Query= ${query};";
Дайте аккуратно отформатированный результат SQL-запроса с одной строкой:
Query = select id from controls where location_id = ( select id from location where code = '003');
Который я считаю весьма полезным и более легким для чтения. Я заменяю одно пространство, чтобы убедиться, что SQL остается дискретным. Важная часть состоит в том, чтобы использовать новую строку (\n
) как фактическую начальную строку или привязку. Прекрасное для смешанных TAB-s и SPACE-s.
Конечно, он также работает и по оригинальному вопросу.
Ответ 6
stripMargin() должен убрать начальные пробелы из строк с полем.
По умолчанию поле |
, Мы также можем указать пользовательское поле.
Например,
def s = """*This
*is
*multiline
"""
println(s.stripMargin("*"))
приведет к
This
is
multiline
Лучше всего в конце добавить .trim(), чтобы исключить начальные и конечные пробелы всей строки.
Например,
println(s.stripMargin("*").trim())
Ответ 7
Как упоминалось в @stefanglase, я использую .stripIndent()
сочетании с .trim()
:
String mystring = """
My multiline
string
contains blank lines
at the beginning and the end
"""
print "*${mystring.stripIndent()}*"
print "*${mystring.stripIndent().trim()}*"
>*
>My multiline
> string
>contains blank lines
> at the beginning and the end
>*
>*My multiline
> string
>contains blank lines
> at the beginning and the end*