Di Java, apakah ada cara untuk menulis string literal tanpa harus keluar dari tanda kutip?

111

Katakanlah Anda memiliki literal String dengan banyak tanda kutip di dalamnya. Anda bisa lolos dari semuanya, tapi itu menyebalkan, dan sulit dibaca.

Dalam beberapa bahasa, Anda bisa melakukan ini:

foo = '"Hello, World"';

Di Java, bagaimanapun, ''digunakan untuk chars, jadi Anda tidak dapat menggunakannya untuk Strings dengan cara ini. Beberapa bahasa memiliki sintaks untuk mengatasi ini. Misalnya, di python, Anda dapat melakukan ini:

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

Apakah Java memiliki sesuatu yang serupa?

Matthew
sumber
Terkait: stackoverflow.com/questions/2678483/…
Michael Mrozek
Jawaban ini menunjukkan cara menempelkan string yang lolos multi-baris di Eclispe.
Jeff Axelrod
2
Pembaruan 2018: literal string mentah untuk Java mungkin akan datang. Lihat jawaban saya di bawah
VonC
impor jackson ObjectMapper kemudian System.out.println(mapperObj.writeValueAsString(mapperObj.readValue(str, Object.class)));
Kervvv
perbarui Q4 2018: string mentah literal belum datang. Lihat jawaban terbaru saya .
VonC

Jawaban:

74

Jawabannya tidak, dan buktinya ada di Spesifikasi Bahasa Java :

  StringLiteral:
   "StringCharacters"

  StringCharacters:
   StringCharacter
   | StringCharacters StringCharacter

  StringCharacter:
   InputCharacter but not " or \
   | EscapeSequence

Seperti yang Anda lihat, StringLiteralhanya bisa terikat oleh "dan tidak dapat berisi karakter khusus tanpa pelarian ..

Catatan tambahan: Anda dapat menanamkan Groovy di dalam proyek Anda, ini akan memperluas sintaks Java yang memungkinkan Anda untuk menggunakannya '''multi line string ''', ' "string with single quotes" 'dan juga "string with ${variable}".

Mendongkrak
sumber
141

Tidak, dan saya selalu kesal dengan kurangnya sintaks string-literal yang berbeda di Java.

Inilah trik yang saya gunakan dari waktu ke waktu:

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

Saya terutama hanya melakukan sesuatu seperti itu untuk bidang statis. Karena statis, kode ganti-string dipanggil sekali, setelah inisialisasi kelas. Jadi hukuman kinerja runtime praktis tidak ada, dan itu membuat kode jauh lebih terbaca.

benjismith
sumber
tidakkah Anda perlu menggunakan replaceAll?
Landon Kuhn
10
@ landon9720 Tidak, .replace menggantikan semua kemunculan urutan karakter / karakter dengan urutan karakter / karakter lain. .replaceAll menggunakan regex.
abelito
Ingin tahu apakah Anda tahu jika compiler java akan menyederhanakan ini saat kompilasi?
ug_
2
Tidak, saya tidak berpikir kompilator akan menyederhanakan ini. Tapi itu tidak terlalu penting. Ini panggilan yang sangat murah, dan jika saya hanya melakukan ini untuk string akhir statis, biaya hanya akan dikeluarkan sekali, setelah pemuatan kelas. Itu harga yang biasanya saya bayarkan untuk mendapatkan kode yang terlihat lebih bagus :)
benjismith
3
Lalu bagaimana dengan "\" di myString?
Anderson
10

Perbarui Des 2018 (12 bulan kemudian):

Literal string mentah (yang ada di daftar amber ) tidak akan sampai ke JDK 12.
Lihat kritiknya di sini .


Mungkin ada versi Java yang akan datang (10 atau lebih).

Lihat JEPS 8196004 dari Januari 2018: ( "JEP" adalah "Program Peningkatan JDK" )

Draf JEP: Literal String Mentah

Tambahkan jenis literal baru, literal string mentah, ke bahasa pemrograman Java.
Seperti literal string tradisional, literal string mentah menghasilkan String, tetapi tidak menafsirkan pelolosan string dan dapat menjangkau beberapa baris kode sumber .

Jadi, alih-alih:

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"));

Anda akan bisa mengetik:

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`));

Rapi!

Tapi itu masih sebatas draft : perlu di-posting, diajukan, menjadi kandidat, dan didanai, sebelum diselesaikan dan dibawa ke JDK berikutnya.

VonC
sumber
5

Jawaban sederhana: Tidak.

Untuk string yang lebih panjang yang harus di-escape, saya biasanya membacanya dari beberapa sumber eksternal.

Chris Lercher
sumber
4

Anda juga dapat menggunakan StringEscapeUtils dari apache commons

UPDATE : Jika seseorang tertarik dengan beberapa contoh, berikut ini tautan yang berguna: https://dzone.com/articles/commons-lang-3-improved-and-powerful-StringEscapeUtils

Doua Beri
sumber
2
Bisakah Anda menambahkan contoh yang mungkin berdasarkan pertanyaan yang menggambarkan bagaimana untuk masalah ini?
Bengt
3
Dianggap kurang optimal untuk hanya mereferensikan sumber daya lain yang mungkin menjawab pertanyaan. Harap pertimbangkan untuk meringkas halaman tertaut dengan contoh yang cocok dengan pertanyaan.
Bengt
Saya melihat dan tidak berpikir benar-benar menjawab pertanyaan itu. Input ke metode statis adalah Strings, jadi tidak ada cara untuk memiliki nilai yang diformat dengan baik dalam kode Anda. Agaknya Anda dapat menggunakan metode ini untuk membaca dari file menjadi a String, tapi saya rasa bukan itu pertanyaannya di sini.
Tom Harrison
Kelas tertaut (org.apache.commons.lang3.StringEscapeUtils) sudah tidak digunakan lagi dan diganti dengan org.apache.commons.text.StringEscapeUtils
jcarter
-4

Berikut ini tampaknya berhasil untuk saya:

String x = "Some Text" + '"' + "More Text" + '"' + "Even More Text";

Saya pikir karena char adalah tipe variabel primitif untuk String, String dan karakter dapat digabungkan (setidaknya compiler eclipse sepertinya tidak mengeluh).

Orang Anonim
sumber
1
Saya pikir karena char adalah tipe variabel primitif untuk String <- Asumsi Anda salah. Dalam hal ini, ini juga akan bekerja dengan tipe yang berbeda, seperti int, seperti: String x = "Beberapa teks" + 33 + "Lebih banyak teks";
Najeeb
-6

Jika Anda ingin melarikan diri 'atau "dalam string Anda, Anda dapat menggunakan kode berikut:

String text = ...

text = text.replaceAll("('|\")", "\\\\$1");
SreejithVS
sumber
Pertanyaan yang diajukan tentang literal string dalam kode sumber. Maaf coba lagi.
michaelb958 - GoFundMonica