Как применить отступ ко всем строкам при вставке многострочных строк в форматированные текстовые блоки
Я начал использовать текстовые блоки 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;
}
}