Как применить отступ ко всем строкам при вставке многострочных строк в форматированные текстовые блоки

Я начал использовать текстовые блоки Java 15, которые удобны для чтения. Теперь я хочу форматировать текстовые блоки и вставлять в них строки, и, насколько я понимаю, идиоматический способ сделать это прямо сейчас - использовать String::formatted. Но кажется, что отступы исходного кода в текстовых блоках немного ограничены при вставке многострочных строк.

Например, следующая программа:

      class Scratch {

    public static void main(String[] args) {

        String text = """
            Hello!
            This is a text block!
            """;

        System.out.println(text);

    }

}

печатает две строки без отступов, как и ожидалось:

      Hello!
This is a text block!

Однако этот:

      class Scratch {

    public static void main(String[] args) {

        String text = """
            Hello!
            This is a text block!
            """;

        String wrapperText = """
            Hello again, now I'd like the entire text below to be indented with a single tab:
                %s
            """.formatted(text);

        System.out.println(wrapperText);

    }

}

печатает следующее:

      Hello again, now I'd like the entire text below to be indented with a single tab:
    Hello!
This is a text block!

тогда как я как бы надеялся получить следующее:

      Hello again, now I'd like the entire text below to be indented with a single tab:
    Hello!
    This is a text block!

Я понимаю, что проблема не в том, что text - это текстовый блок в моей второй программе, он мог бы также быть традиционным строковым литералом с символом новой строки \n, и результат был бы таким же. Блок текста оболочки явно применяет отступ только к первой строке внедренной многострочной строки, что понятно, поскольку он, вероятно, просто добавляет введенную строку, как и после отступа.

Итак, я предполагаю, что мой вопрос: есть ли чистый способ применить отступ, указанный в текстовом блоке оболочки, ко всем строкам введенной строки?

Я знаю, что могу сделать что-то вроде .formatted(text.replaceAll("\n", "\n\t")) для форматирования текстового блока, но это неуклюже, делает предположения о последовательности завершения строки и побеждает цель указания отступа в одном месте, потому что тогда, если я хочу обновить отступ, мне нужно будет сделать это как в текстовый блок и в замещающей строке.

1 ответ

Я использую Java 8. Вот один из способов сделать отступ многострочного String.

Вот результаты одного из моих тестов.

      Hello!
This is a text block!

Hello again, now I'd like the entire text below to be indented with 4 spaces:
    Hello!
    This is a text block!

Возможно, вам придется настроить indentспособ работы с Java 15.

Вот полный исполняемый код.

      public class TextIndentationTesting {

    public static void main(String[] args) {
        TextIndentationTesting tit = new TextIndentationTesting();

        String text = "Hello!\nThis is a text block!";
        System.out.println(text);
        System.out.println();

        String wrapperText = "Hello again, now I'd like the entire text below "
                + "to be indented with 4 spaces:";
        System.out.println(wrapperText + "\n" + tit.indent(text, 4));
    }

    public String indent(String text, int indentation) {
        // Create the indent space
        StringBuilder indentBuilder = new StringBuilder();
        for (int index = 0; index < indentation; index++) {
            indentBuilder.append(' ');
        }
        String indentSpace = indentBuilder.toString();

        // Indent the text
        String lineSeparator = Character.toString((char) 10);
        String replacement = lineSeparator + indentSpace;
        text = text.replaceAll(lineSeparator, replacement);

        return indentSpace + text;
    }

}
Другие вопросы по тегам