在 Java 中,有没有一种不用转义引号就可以写字符串文字的方法?

假设您有一个 String 文字,其中包含许多引号。你可以逃避这一切,但这是一种痛苦,而且难以阅读。

In some languages, you can just do this:

foo = '"Hello, World"';

然而,在 Java 中,''用于 char,因此不能以这种方式将它用于 String。有些语言使用语法来解决这个问题。例如,在 python 中,您可以这样做:

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

Java 有类似的东西吗?

125831 次浏览

答案是否定的,证据就在 Java 语言规范中:

  StringLiteral:
"StringCharacters"


StringCharacters:
StringCharacter
| StringCharacters StringCharacter


StringCharacter:
InputCharacter but not " or \
| EscapeSequence

正如你所看到的,StringLiteral只能被 "绑定,不能包含没有转义的特殊字符。

附注: 您可以将 好极了嵌入到您的项目中,这将扩展 Java 语法,允许您使用 '''multi line string '''' "string with single quotes" '"string with ${variable}"

答案很简单: 不。

对于必须转义的较长字符串,我通常从某些外部资源读取它们。

没有,而且我一直对 Java 中缺乏不同的字符串字面语法感到恼火。

下面是我不时使用的一个技巧:

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

我主要只对静态场做类似的操作。由于字符串替换代码是静态的,所以在类初始化时会调用一次。因此,运行时性能损失实际上是不存在的,并且它使得代码更加易读。

您还可以使用来自 apachecommons 的 StringEscapeUtils

更新 : 如果有人对某些例子感兴趣,这里有一个有用的链接: < a href = “ https://dzone.com/article/commons-lang-3-better-and-power-StringEscapeUtils”rel = “ nofollow noReferrer”> https://dzone.com/articles/commons-lang-3-improved-and-powerful-stringescapeutils

以下几点似乎对我有用:

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

我认为,因为 char 是 String 的基本变量类型,所以可以将 String 和 char 结合起来(至少 Eclipse 编译器似乎没有抱怨)。

2018年12月更新(12个月后) :

原始字符串文字(位于 琥珀名单上)无法到达 JDK 12。
看看 这里的批评


在 Java 的未来版本中可能会有(10个或更多)。

JEPS 8196004(2018年1月) : (“ JEP”是“ JDK 增强程序”)

JEP 草案: 原始字符串文字

向 Java 编程语言中添加一种新的文字,即原始字符串文字。
与传统的字符串文本一样,原始字符串文本也生成一个 String,但是生成的是 不解释字符串转义并且可以跨多行源代码

所以不是:

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 之前,它将需要发布、提交、成为候选者和资助。

自从 Java151出现了一个叫做文本块的新特性。它看起来与您提到的 Python 中的内容类似:

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

更多的细节和例子可以在这里找到: https://openjdk.java.net/jeps/378


1 在 Java13和 Java14中预览。

你可以使用左引号和/或右引号,如果你不介意区别的话,它们看起来非常相似:

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