Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类似Java的Scala中的三重引号_Java_Scala_Java Text Blocks - Fatal编程技术网

类似Java的Scala中的三重引号

类似Java的Scala中的三重引号,java,scala,java-text-blocks,Java,Scala,Java Text Blocks,在Scala中,您可以执行以下操作: val expr = """ This is a "string" with "quotes" in it! """ Java中有类似的东西吗?我讨厌使用“\”来表示带引号的字符串。尤其是在JSON中组成键/值对时。令人恶心!除了使用\“在字符串文本中包含双引号之外,没有其他好的选择 有一些糟糕的选择: 使用双引号字符的Unicode转义符\u0022。编译器将Unicode转义视为该字符已键入。它在源代码中被视为双引号字符,以Stringliteral

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

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

Java中有类似的东西吗?我讨厌使用
“\”
来表示带引号的字符串。尤其是在JSON中组成键/值对时。令人恶心!

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

有一些糟糕的选择:

  • 使用双引号字符的Unicode转义符
    \u0022
    。编译器将Unicode转义视为该字符已键入。它在源代码中被视为双引号字符,以
    String
    literal结尾/开头,因此这不起作用
  • 连接字符
    “”
    ,例如
    “这是一个“+”“+”字符串”
    。这将起作用,但它似乎比仅仅使用
    \“
    更难看,可读性更低
  • 连接
    char
    34以表示双引号字符,例如
    “这是一个”+(char)34+“字符串”
    。这会起作用,但更不明显的是,您试图在字符串中放置双引号字符
  • 复制并粘贴Word的“智能引号”,例如,
    “这是一个包含“引号”的“字符串”!“
    。这些字符不同(Unicode U+201C和U+201D);它们有不同的外观,但可以使用
我想,要隐藏“恶心”的感觉,你可以把它隐藏在一个常数后面

public static final String DOUBLE_QUOTE = "\"";
然后你可以使用:

String expr = " This is a " + DOUBLE_QUOTE + "string" + DOUBLE_QUOTE + ...;
它比其他选项更具可读性,但它仍然不是很可读,而且仍然很难看


Java中没有
机制,因此使用escape
\“
”是最佳选项。它是可读性最好的,也是最不难看的。

在做同样的事情时发现了这个问题:编写用于快速测试的小文本JSON字符串。一个没有出现的替代方案是使用双单引号,并将其替换为双引号,类似于:

String json = "{ ''label'' : ''set range'', ''min'' : 0, ''max'' : 100}".replace("''", "\"")
显然,如果有一个常规的双单报价,这是行不通的,但这样做的可能性应该很小。这不是一个很好的解决方案,但看起来比很多反斜杠要好,依我看。作为将json放在单独文件中的中间步骤,这可能并不太糟糕

自Java 13以来的预览功能

裁判: 它不能以Scala的方式精确地工作。开头的三个引号后面必须有新行

var expr = """
           This is a 1-line "string" with "quotes" and no leading spaces in it! """;
收盘三重报价的位置很重要。它定义缩进大小。例如,对于缩进两个空格,可以按如下方式定位结束符
“”“

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

将等待Java 15。

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

最后,它在Java13中作为
的“文本块”
功能,但仅在预览中使用


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

请看一看。。我认为在Java中没有其他方法。你知道每种语言都是不同的!将JSON放在一个单独的文件中并从中读取可能会更容易。您应该使用JSON库来编写JSON,而不是字符串串联。@DavidConrad-我同意,但是如果您只是想做一些简单的事情,使用Groovy is可能也是一个选项。为什么要使用
DOUBLE\u QUOTE
(char)34
而不是
(单引号双引号char)?最好的选项仍然是
\”
,但我觉得奇怪的是你忽略了
。我想,为了完整起见,您可以提到使用一些您知道不在数据中的无关字符,比如“#”,然后进行替换,将它们转换为引号。但这看起来很不稳定。在某些情况下,您可能会不可预测地破坏原始值:{“msg”:“预期:不是空字符串。Was:arg=''”。}。正如我所说,“如果有常规的双单引号,显然这不起作用”。这只是调试的权宜之计,不应在生产代码中使用。但我认为从答案来看,这是令人讨厌的……优雅的黑客!我会更粗糙*,使用单引号,a-la JavaScript*粗糙但有效。@Markhu,是的,这基本上适用于任何非双引号字符(或字符序列)。我只是选择了
,因为它类似于双引号,不太可能出现在我想要添加的标记中。