在Java中,有没有办法在不必转义引号的情况下编写字符串文字?

Mat*_*hew 106 java string escaping

假设你有一个字符串文字,里面有很多引号.你可以逃避所有这些,但这是一种痛苦,难以阅读.

在某些语言中,您可以这样做:

foo = '"Hello, World"';
Run Code Online (Sandbox Code Playgroud)

但是,在Java中,s ''用于chars,因此不能以String这种方式使用它.有些语言有解决此问题的语法.例如,在python中,您可以这样做:

"""A pretty "convenient" string"""
Run Code Online (Sandbox Code Playgroud)

Java有类似的东西吗?

ben*_*ith 137

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('`', '"');
Run Code Online (Sandbox Code Playgroud)

我主要只为静态字段做类似的事情.由于它是静态的,因此在初始化类时,字符串替换代码会被调用一次.因此,运行时性能损失实际上是不存在的,并且它使代码更加清晰.

  • @ landon9720否,.replace将所有出现的字符/字符序列替换为另一个字符/字符序列..replaceAll使用正则表达式. (7认同)
  • 好戏!我想我会开始使用它. (3认同)
  • 不,我不认为编译器会简化这一点.但这并不重要.这是一个非常便宜的调用,如果我只对静态最终字符串执行此操作,则只会在类加载时产生一次成本.这是我通常愿意为更好看的代码支付的价格:) (2认同)
  • 那么myString中的"\"呢? (2认同)

Jac*_*ack 72

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

  StringLiteral:
   "StringCharacters"

  StringCharacters:
   StringCharacter
   | StringCharacters StringCharacter

  StringCharacter:
   InputCharacter but not " or \
   | EscapeSequence
Run Code Online (Sandbox Code Playgroud)

你可以看到一个StringLiteral可以被绑定"但不能包含没有转义的特殊字符.

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


Mat*_*hel 21

从 Java 15\xc2\xb9 开始,出现了称为文本块的新功能。它看起来类似于你提到的 Python 中可用的内容:

\n
String text = """\n              {\n                 "property": "value",\n                 "otherProperty": 12\n              }\n              """;\n
Run Code Online (Sandbox Code Playgroud)\n

更多详细信息和示例可以在这里找到: https: //openjdk.java.net/jeps/378 JEP 378:文本块

\n
\n

\xc2\xb9在 Java 13 和 14 中预览。

\n


Von*_*onC 9

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

原始字符串文字(在琥珀色列表中)将不会进入JDK 12.
请参阅此处批评.


Java的未来版本可能存在(10个或更多).

从2018年1月开始参见JEPS 8196004 :( "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"));
Run Code Online (Sandbox Code Playgroud)

你可以输入:

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`));
Run Code Online (Sandbox Code Playgroud)

整齐!

但它仍然只是一个草案:在完成并进入下一个JDK之前,它需要发布,提交,成为候选人并获得资助.


Chr*_*her 5

简单的回答:不。

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


Dou*_*eri 5

你也可以使用apache commons中的StringEscapeUtils

更新:如果有人对某些示例感兴趣,这里有一个有用的链接:http://java.dzone.com/articles/commons-lang-3-improved-and-powerful-StringEscapeUtils

  • [仅仅引用可能回答问题的另一个资源被认为是次优的.](http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-答案)请考虑使用与问题匹配的示例总结链接页面. (3认同)
  • 您能否根据说明如何解决此问题的问题添加一个示例? (2认同)