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?



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}".


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.


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.


5

Jawaban sederhana: Tidak.

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


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


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).


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

Pertanyaan yang diajukan tentang literal string dalam kode sumber. Maaf coba lagi.
michaelb958 - GoFundMonica
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.