0

我开始使用便于阅读的 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"))格式化文本块的事情,但这很笨拙,对行终止顺序做出假设,并且违背了在一个地方指定缩进的目的,因为如果我想更新缩进,我需要在文本块和替换字符串中执行此操作。

4

1 回答 1

0

我使用 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;
    }

}
于 2022-01-02T15:53:35.237 回答