web-dev-qa-db-ja.com

Javaでは、引用符をエスケープせずに文字列リテラルを書く方法はありますか?

文字列リテラルに多くの引用符が含まれているとします。あなたはそれらをすべて逃げることができますが、それは苦痛であり、読みにくいです。

一部の言語では、これを行うことができます。

foo = '"Hello, World"';

ただし、Javaでは、''charsに使用されるため、このようにStringsに使用することはできません。一部の言語には、これを回避する構文があります。たとえば、Pythonでこれを行うことができます。

"""A pretty "convenient" string"""

Java似たようなものはありますか?

104
Matthew

答えはノーであり、証明はJava言語仕様にあります:

  StringLiteral:
   "StringCharacters"

  StringCharacters:
   StringCharacter
   | StringCharacters StringCharacter

  StringCharacter:
   InputCharacter but not " or \
   | EscapeSequence

ご覧のとおり、StringLiteral"でバインドでき、エスケープなしで特殊文字を含めることはできません。

サイドノート:プロジェクト内に Groovy を埋め込むことができます。これにより、Javaの構文が拡張され、'''multi line string '''' "string with single quotes" 'また、"string with ${variable}"

70
Jack

いいえ、Javaにはさまざまな文字列リテラル構文がないことにいつも悩まされています。

これは私がときどき使用したトリックです。

String myString = "using `backticks` instead of quotes".replace('`', '"');

私は主に静的フィールドに対してのみそのようなことをします。静的なので、文字列置換コードはクラスの初期化時に一度呼び出されます。そのため、実行時のパフォーマンスペナルティは実質的に存在せず、コードが非常に読みやすくなります。

133
benjismith

2018年12月の更新(12か月後):

生の文字列リテラル( a色のリスト にあります)は、JDK 12に到達しません。
批評はこちら 」を参照してください。


Java(10以上)の将来のバージョンに存在する可能性があります。

2018年1月から JEPS 8196004 を参照してください:( 「JEP」は「JDK拡張プログラム」です

JEPドラフト:生の文字列リテラル

Javaプログラミング言語に新しい種類のリテラル、生の文字列リテラルを追加します。
従来の文字列リテラルと同様に、生の文字列リテラルは文字列を生成しますが、は文字列エスケープを解釈せず、ソースコードの複数行にまたがることができます.

代わりに:

Runtime.getRuntime().exec("\"C:\\Program Files\\foo\" bar");
String html = "<html>\n"
              "    <body>\n" +
              "         <p>Hello World.</p>\n" +
              "    </body>\n" +
              "</html>\n";
System.out.println("this".matches("\\w\\w\\w\\w"));

次のように入力できます。

Runtime.getRuntime().exec(`"C:\Program Files\foo" bar"`);

String html = `<html>
                   <body>
                       <p>Hello World.</p>
                   </body>
               </html>
              `;

System.out.println("this".matches(`\w\w\w\w`));

きちんとした!

しかし、それはまだです ドラフトのみ :完成して次のJDKに入れる前に、投稿、提出、候補者、資金提供する必要があります。

8
VonC

apache commonsの StringEscapeUtils も使用できます。

[〜#〜] update [〜#〜]:もし誰かがいくつかの例に興味があるなら、ここに役立つリンクがあります: http:/ /Java.dzone.com/articles/commons-lang-3-improved-and-powerful-StringEscapeUtils

5
Doua Beri

簡単な答え:いいえ。

エスケープする必要がある長い文字列については、通常、外部リソースから読み取ります。

4
Chris Lercher