Java中的三重引号,如Scala

时间:2015-02-06 00:51:22

标签: java scala

在Scala中,您可以执行以下操作:

val expr = """ This is a "string" with "quotes" in it! """

Java中有这样的东西吗?我厌恶使用"\""来表示带引号的字符串。特别是在JSON中组合键/值对时。恶心!

4 个答案:

答案 0 :(得分:7)

使用\"在字符串文字中包含双引号没有其他好的替代方法。

有不好的选择:

  • 使用\u0022,双引号字符的Unicode转义符。编译器将Unicode转义视为键入该字符。它被视为源代码中的双引号字符,结束/开始String字面值,因此不起作用。
  • 连接字符'"',例如"This is a " + '"' + "string"。这样可行,但与使用\"
  • 相比,它似乎更加丑陋且不易阅读
  • 连接char 34以表示双引号字符,例如"This is a " + (char) 34 + "string"。这样可行,但是你试图在字符串中放置一个双引号字符就更不明显了。
  • 复制并粘贴Word的“智能引号”,例如"This is a “string” with “quotes” in it!"。这些字符不一样(Unicode U + 201C和U + 201D);他们有不同的外表,但他们会工作。

我想隐藏“恶心”,你可以将它隐藏在常数之后。

public static final String DOUBLE_QUOTE = "\"";

然后你可以使用:

String expr = " This is a " + DOUBLE_QUOTE + "string" + DOUBLE_QUOTE + ...;

它比其他选项更具可读性,但它仍然不是很易读,而且它仍然很难看。

Java中没有"""机制,因此使用escape \"是最佳选择。它是最具可读性的,也是最难看的。

答案 1 :(得分:4)

自Java 13 预览功能

以来

REF:https://openjdk.java.net/jeps/355

它不能完全以Scala方式工作。开头的三引号必须,后接新行。

var expr = """
           This is a 1-line "string" with "quotes" and no leading spaces in it! """;

尾部三引号的位置很重要。它定义了缩进大小。例如,对于缩进2个空格,您可以按以下方式放置结束"""

String sql = """
               SELECT   emp_id, last_name
               FROM     postgres.employee
               WHERE    city = 'INDIANAPOLIS'
               ORDER BY emp_id, last_name;
             """;

这将导致四行文字:

  SELECT   emp_id, last_name
  FROM     postgres.employee
  WHERE    city = 'INDIANAPOLIS'
  ORDER BY emp_id, last_name;

转义:

点滴引号转义很直观:

String txt = """
    A text block with three quotes \""" inside.""";

注意::此功能是预览功能,因此除非您设置了--enable-preview TextBlock键,否则您无法在Java 13中使用它。

更新:该功能已在Java 14上用于the second preview (JEP 368)

将等待Java 15。

答案 2 :(得分:1)

在做同样的事情时发现了这个问题:编写小的文字JSON字符串以便快速测试。一个没有出现的替代方案是使用双引号并用双引号替换它们,例如:

String json = "{ ''label'' : ''set range'', ''min'' : 0, ''max'' : 100}".replace("''", "\"")

显然,如果有一个常规的双单引号,这不起作用,但这种可能性很小。这不是一个很好的解决方案,但看起来比很多反斜杠,imo更好。作为将json放在单独文件中的中间步骤,这可能不是太糟糕。

答案 3 :(得分:0)

“原始字符串文字”的功能原本是在 Java 12 中使用的,但由于一些批评而被withdrawn使用,因为他们计划使用可变数量的反引号(`)

因此,它最终在 Java 13 中作为“文本块”功能出现,但仅在预览中。像在Scala中一样,它正在使用"""运算符。

您可以阅读有关Java 13功能here的更多信息。