Java 13テキストブロック* WITHOUT *改行


12

"""デリミタ付きのJava 13マルチラインテキストブロック機能はよく知られています。

ただし、埋め込まれた改行なしで段落全体が必要な場合は、繰り返し必要があります。

つまり、次のコードスニペット:

String paragraph =
    """
    aaaa bbbb cccc
    dddd eeee ffff
    gggg hhhh iiii
    """"
System.out.println(paragraph);

あなたが期待するように、以下を生成します:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

...通常、これは非常に便利です。ただし、私の場合、特に大きな段落の場合、これを生成するために必要です。

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(....そして、後でテキストフローを扱います。)

三重引用符機能に「改行なし」パラメーターを設定する方法はありますか?


後でHTMLドキュメントの一部となる大量のテキストを入力したり、同じように(たとえば)サイズ変更可能なダイアログボックスに流れ込んだりすることを想像してください。私は、データの多くの「行」の価値で入力したいのない"line" + "line" + "line"、など、およびEOLのが現れてなくて。このようなあいまいで構文を維持するのが難しいのを完全に回避することがポイント"""です。
alife

回答:


16

この機能の設計者は、この要件も実現しました(JEP368の「新しいエスケープシーケンス」を参照)。したがって、JDK 14の最新の早期アクセスビルドでは、末尾\を使用して、行の最後で新しい行をエスケープできます。

public class Main {
    public static void main(String[] args) {
        String paragraph =
            """
            aaaa bbbb cccc \
            dddd eeee ffff \
            gggg hhhh iiii \
            """;
        System.out.println(paragraph);
    }
}

プリント:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

14、ハァッ?インデントの連結がどのように機能するのか、またはすべての空白がきれいにワイプされているのでしょうか?
alife

ただし、その場合でも、既存の文字列入力を変更する必要があります。この場合、改行自体を直接削除するのに十分な価値があるかもしれません。
ナマン

3
うーん、最初、彼らはそれが言語の変更を正当化するような重要な機能である、今では自分でエスケープシーケンスを取得し、私は不思議に持っているように、あるリテラルテキストを埋め込むことができること、何を置くよりも有利だと言う"aaaa bbbb cccc "+"dddd eeee ffff "+"gggg hhhh iiii "、各はっきりとした線で…
Holger

@Holger機能は2つに分割されました。テキストブロック(別名複数行文字列)、および生の文字列リテラル(つまり、現状のままの文字列、tbd)。これは前者です。のような他のエスケープは\nまだテキストブロックで機能することに注意してください。
Jorn Vernee、

1
しかし、今ではreadString、埋め込まれたリソースも扱いやすくなっています。段落全体をソースコードに統合したくありませんでした。I/ Oの要素だけが煩わしいものでした。
Holger

4

String.linesJava-11以降で導入されたものを次のように使用できます。

String output = paragraph.lines().collect(Collectors.joining());

補足として、価値のあるものとして、次の2つの異なるコードブロックのJShell実行のスクリーンショットを示します。

ここに画像の説明を入力してください


3
…次と同じString output = paragraph.replaceAll("[\n\r]", "");
Holger

そして、(JDK-14のブロック\s内での許可の変更まで)解決策ではなく、"""EOLのない行と実際にハードリターンが必要な行(段落間など)を混在させることができます
alife

1

確かに、Java 13で適切な答えを見つけるのは簡単ではありません(多分不可能かもしれません)が、Jorn Verneeは彼の返信で懸念に優雅に対処したと思います(Java 14の新しいエスケープシーケンスは許容できる解決策を提供します)。

リストされているいくつかの懸念事項をさらに詳しく説明します。

  • Holgerは「「テキストブロック」機能はあまり説得力がない」と述べています。人工的な文字列連結を行う「醜い」コードをたくさん見たので、、この機能は間違いなく問題に対処している。反対に、私はこのような機能が悪用の余地をたくさん残していることに同意する必要があります(「Javaコードにたくさんのテキストを入れましょう」のようになりました-次のポイントを参照)。 )。
  • 元の質問は「大きな段落」について言及しており、この機能をまったく使用せずに、そのコンテンツをリソースファイルに外部化するようにアドバイスしています。
  • 明快さと特定の側面については「読者には明らかではないため、明白でない意味を持つ構文があります」。それは部分的に正しいです、そして、利用可能な資料が現時点でそれほど大きくない間、それはいくつかの読書と実験を必要とします。私はこれを見つけました:かなり多くの例を提供するテキストブロックへのプログラマーのガイド。私はいくつかの例も作成しました。テキストブロックの例はここにあります:TextBlocks.java-うまくいけばそれらが役立つでしょう。

モデレーターへの注意:この回答はガイドラインに違反している可能性があることを知っています(質問には対応せず、他のユーザーのコメントに返信します)。ただし、進行中のトピックについては議論の余地があるはずです。 (テキストブロックが「2番目のプレビュー」モードであることを忘れないでください)。


0

paragraph.replaceAll("\\n","") あなたのために仕事をする必要があります。


行末でエスケープ文字を使用しているため、Intellijが何らかのクラッシュループに陥っています。おそらく、最善の方法は、""" line line line """.replaceAll("\\n",""); 現時点では確認できないことです。
人工生命

これはコンパイル時にではなく実行時に処理される(マイナー)問題もあると思いますが、それは私の目的の要件ではありません。
alife 19/12/12

このソリューションも\s、JDK-14の機能を十分に活用することができません。改行なしで複数の段落が必要だが、その間に改行がある場合はどうなりますか。
alife
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.