Подтвердить что ты не робот

Отступ полосы в groovy многострочных строках

К сожалению stripIndent в многострочной строке не работает. Боковое примечание: мои настройки стиля кода IDE допускают только отступы в пространстве (вкладки будут заменены пробелами). Но я думаю, что это не должно иметь значения.

def s = """ This 
            is
            multiline
"""
println s.stripIndent()

не печатает

This
is
multiline

как ожидалось.

Выход с отступом.

This 
               is
               multiline

Что здесь происходит?

Я использую Groovy 2.0.7 с Eclipse Indigo SR2.

Проблема, похоже, исчезает с использованием обратной косой черты (символ продолжения строки) в первой строке. Но я не понимаю, почему это необходимо.

4b9b3361

Ответ 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*