Java中的三引号(如Scala)

e5nqia27  于 2022-11-29  发布在  Scala
关注(0)|答案(6)|浏览(267)

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

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

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

mjqavswn

mjqavswn1#

自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中升级到the second preview (JEP 368)

将等待Java 15。

nhaq1z21

nhaq1z212#

除了使用\"在字符串文字中包含双引号之外,没有其他好的替代方法。
有一些不好的替代方案:

  • 使用\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+201 C和U+201 D);它们的外观不同,但都能用

我想要隐藏“恶心”的东西,你可以把它藏在一个常数后面。

public static final String DOUBLE_QUOTE = "\"";

然后您可以用途:

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

它比其他选项更可读,但它仍然不是很可读,它仍然是丑陋的。
在Java中没有"""机制,所以使用转义字符\"是最好的选择。它是最可读的,也是最不难看的。

eimct9ow

eimct9ow3#

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

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

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

wfveoks0

wfveoks04#

"Raw String Literals"的特性原本应该在Java 12中出现,但由于一些批评而被withdrawn取代,因为他们计划使用可变数量的反引号()。 最后在**Java 13**中,作为"Text Block"特性,但是只在**preview**中使用,它使用了像Scala中一样的"""`操作符。
您可以在这里阅读更多关于Java 13特性的信息。

qmb5sa22

qmb5sa225#

Java 14起提供了三重引号功能。有关更多详细信息,请参见例如https://howtodoinjava.com/java14/java-text-blocks/

7ivaypg9

7ivaypg96#

您需要的特性称为Text Blocks,在Java 15 JEP378中提供。

历史

JEP 355在2019年初提出了文本块,作为JEP 326开始的探索的后续(原始字符串文字),JEP 355在2019年6月作为预览版特性面向JDK 13。关于JDK13的反馈建议在JDK14中再次预览文本块,并添加两个新的转义序列,JEP 368于2019年11月作为预览功能被定向到JDK 14。JDK 14的反馈表明,文本块已经准备好在JDK 15中成为最终的和永久的,没有进一步的更改。

用法

String query = """
               SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"
               WHERE "CITY" = 'INDIANAPOLIS'
               ORDER BY "EMP_ID", "LAST_NAME";
               """;

相关问题