10

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

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

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

4

4 回答 4

12

\"除了使用在字符串文字中包含双引号之外,没有其他好的选择。

有不好的选择:

  • 使用\u0022, 双引号字符的 Unicode 转义。编译器将 Unicode 转义视为输入了该字符。它在源代码中被视为双引号字符,以文字结尾/开头String,所以这不起作用。
  • 连接字符'"',例如"This is a " + '"' + "string"。这会起作用,但它似乎比仅使用\".
  • 连接char34 以表示双引号字符,例如"This is a " + (char) 34 + "string". 这将起作用,但是您尝试在字符串中放置双引号字符就更不明显了。
  • 复制并粘贴 Word 的“智能引号”,例如"This is a “string” with “quotes” in it!". 这些不是相同的字符(Unicode U+201C 和 U+201D);它们有不同的外观,但它们会起作用。

我想隐藏“恶心”-ness,你可以把它隐藏在一个常数后面。

public static final String DOUBLE_QUOTE = "\"";

然后你可以使用:

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

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

Java中没有"""机制,因此使用 escape\"是最好的选择。它是最易读的,也是最不难看的。

于 2015-02-06T01:15:16.920 回答
10

自 Java 13预览功能

参考: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;
             """;

这将产生 4 行文本:

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

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

更新:该功能进入Java 14的第二个预览版 (JEP 368)

将等待 Java 15。

于 2020-01-21T10:40:05.057 回答
4

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

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

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

于 2017-10-31T15:06:19.087 回答
0

的功能"Raw String Literals"原本是在Java 12中,但由于一些批评而被撤回,因为他们计划使用可变数量的反引号(`)。

所以它最终在Java 13中作为"Text Block"功能,但仅在预览中。它使用"""Scala 中的运算符。

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

于 2020-09-09T06:32:10.053 回答