'In Java, is there a way to write a string literal without having to escape quotes?

Say you have a String literal with a lot of quotation marks inside it. You could escape them all, but it's a pain, and difficult to read.

In some languages, you can just do this:

foo = '"Hello, World"';

In Java, however, '' is used for chars, so you can't use it for Strings this way. Some languages have syntax to work around this. For example, in python, you can do this:

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

Does Java have anything similar?



Solution 1:[1]

No, and I've always been annoyed by the lack of different string-literal syntaxes in Java.

Here's a trick I've used from time to time:

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

I mainly only do something like that for a static field. Since it's static the string-replace code gets called once, upon initialization of the class. So the runtime performance penalty is practically nonexistent, and it makes the code considerably more legible.

Solution 2:[2]

Update Dec. 2018 (12 months later):

Raw string literals (which are on the amber list) won't make it to JDK 12.
See the criticisms here.


There might be in a future version of Java (10 or more).

See JEPS 8196004 from January 2018: ("JEP" is the "JDK Enhancement Program")

JEP draft: Raw String Literals

Add a new kind of literal, a raw string literal, to the Java programming language.
Like the traditional string literal, a raw string literal produces a String, but does not interpret string escapes and can span multiple lines of source code.

So instead of:

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

You would be able to type:

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

Neat!

But it is still just a draft: it will need to posted, submitted, be a candidate, and funded, before being completed and making it into the next JDK.

Solution 3:[3]

Since Java 15¹ there is new feature called Text Blocks. It looks similar to what you mentioned is available in Python:

String text = """
              {
                 "property": "value",
                 "otherProperty": 12
              }
              """;

More details with examples can be found here: https://openjdk.java.net/jeps/378.


¹ Previewed in Java 13 and 14.

Solution 4:[4]

Simple answer: No.

For longer strings that must be escaped, I usually read them from some external resource.

Solution 5:[5]

you can also use StringEscapeUtils from apache commons

UPDATE: If someone is interested in some examples here is a useful link : https://dzone.com/articles/commons-lang-3-improved-and-powerful-StringEscapeUtils

Solution 6:[6]

You could use left and/or right quotes if you don't mind the difference, they look pretty similar:

"These “double quotes” don't need nor want to be escaped"

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 benjismith
Solution 2 Community
Solution 3 Jacob van Lingen
Solution 4 Chris Lercher
Solution 5 Razzle
Solution 6 h4nek