In Java, is there a way to write a string literal without having to escape quotes?
JavaStringEscapingJava Problem Overview
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 char
s, so you can't use it for String
s 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?
Java Solutions
Solution 1 - Java
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 - Java
The answer is no, and the proof resides in the Java Language Specification:
StringLiteral:
"StringCharacters"
StringCharacters:
StringCharacter
| StringCharacters StringCharacter
StringCharacter:
InputCharacter but not " or \
| EscapeSequence
As you can see a StringLiteral
can just be bound by "
and cannot contain special character without escapes..
A side note: you can embed Groovy inside your project, this will extend the syntax of Java allowing you to use '''multi line string '''
, ' "string with single quotes" '
and also "string with ${variable}"
.
Solution 3 - Java
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 4 - Java
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 5 - Java
Simple answer: No.
For longer strings that must be escaped, I usually read them from some external resource.
Solution 6 - Java
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 7 - Java
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"
Solution 8 - Java
The following seems to work for me:
String x = "Some Text" + '"' + "More Text" + '"' + "Even More Text";
I think because char is the primitive variable type for String, Strings and chars can be combined (at least the eclipse compiler doesn't seem to complain).