在Scala中,您可以执行以下操作:
val expr = """ This is a "string" with "quotes" in it! """
Java中有这样的东西吗?我讨厌用"\""来表示带引号的字符串。特别是在JSON中组成键/值对时。恶心!
"\""
mjqavswn1#
自Java 13以来预览功能
在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)。
--enable-preview TextBlock
将等待Java 15。
nhaq1z212#
除了使用\"在字符串文字中包含双引号之外,没有其他好的替代方法。有一些不好的替代方案:
\"
\u0022
String
'"'
"This is a " + '"' + "string"
char
"This is a " + (char) 34 + "string"
"This is a “string” with “quotes” in it!"
我想要隐藏“恶心”的东西,你可以把它藏在一个常数后面。
public static final String DOUBLE_QUOTE = "\"";
然后您可以用途:
String expr = " This is a " + DOUBLE_QUOTE + "string" + DOUBLE_QUOTE + ...;
它比其他选项更可读,但它仍然不是很可读,它仍然是丑陋的。在Java中没有"""机制,所以使用转义字符\"是最好的选择。它是最可读的,也是最不难看的。
eimct9ow3#
在做同样的事情时发现了这个问题:组成小的文本JSON字符串进行快速测试。一个没有出现的替代方法是使用双单引号并将其替换为双引号,类似于:
String json = "{ ''label'' : ''set range'', ''min'' : 0, ''max'' : 100}".replace("''", "\"")
显然,如果有一个常规的双单引号,这就不起作用了,但这种可能性应该很小。这不是一个很好的解决方案,但看起来比大量的反斜杠要好,imo。作为将json放在一个单独文件中的中间步骤,这可能不是太糟糕。
wfveoks04#
"Raw String Literals"的特性原本应该在Java 12中出现,但由于一些批评而被withdrawn取代,因为他们计划使用可变数量的反引号()。 最后在**Java 13**中,作为"Text Block"特性,但是只在**preview**中使用,它使用了像Scala中一样的"""`操作符。您可以在这里阅读更多关于Java 13特性的信息。
"Raw String Literals"
)。 最后在**Java 13**中,作为
特性,但是只在**preview**中使用,它使用了像Scala中一样的
qmb5sa225#
自Java 14起提供了三重引号功能。有关更多详细信息,请参见例如https://howtodoinjava.com/java14/java-text-blocks/
7ivaypg96#
您需要的特性称为Text Blocks,在Java 15 JEP378中提供。
Text Blocks
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"; """;
6条答案
按热度按时间mjqavswn1#
自Java 13以来预览功能
参考:https://openjdk.java.net/jeps/355
在Scala中,它并不能精确地工作。开始的三重引号必须后跟一个新行。
右三引号的位置很重要。它定义了缩进大小。例如,要缩进2个空格,请按如下方式放置右
"""
:这将产生4行文本:
逃逸:
三引号转义是直观的:
**注意:**此功能是预览功能,因此您不能在Java 13中使用它,除非您设置了
--enable-preview TextBlock
键.**更新:**该特性在Java 14中升级到the second preview (JEP 368)。
将等待Java 15。
nhaq1z212#
除了使用
\"
在字符串文字中包含双引号之外,没有其他好的替代方法。有一些不好的替代方案:
\u0022
,双引号字符的Unicode转义。编译器将Unicode转义视为该字符已键入。它在 * 源代码 * 中被视为双引号字符,以String
文字结尾/开头,因此这不起作用。'"'
,例如"This is a " + '"' + "string"
。这是可行的,但它似乎更丑陋,可读性不如只使用\"
。char
34来表示双引号字符,例如"This is a " + (char) 34 + "string"
。这是可行的,但更不明显的是,您试图在字符串中放置双引号字符。"This is a “string” with “quotes” in it!"
。它们不是相同的字符(Unicode U+201 C和U+201 D);它们的外观不同,但都能用我想要隐藏“恶心”的东西,你可以把它藏在一个常数后面。
然后您可以用途:
它比其他选项更可读,但它仍然不是很可读,它仍然是丑陋的。
在Java中没有
"""
机制,所以使用转义字符\"
是最好的选择。它是最可读的,也是最不难看的。eimct9ow3#
在做同样的事情时发现了这个问题:组成小的文本JSON字符串进行快速测试。一个没有出现的替代方法是使用双单引号并将其替换为双引号,类似于:
显然,如果有一个常规的双单引号,这就不起作用了,但这种可能性应该很小。这不是一个很好的解决方案,但看起来比大量的反斜杠要好,imo。作为将json放在一个单独文件中的中间步骤,这可能不是太糟糕。
wfveoks04#
"Raw String Literals"
的特性原本应该在Java 12中出现,但由于一些批评而被withdrawn取代,因为他们计划使用可变数量的反引号()。 最后在**Java 13**中,作为
"Text Block"特性,但是只在**preview**中使用,它使用了像Scala中一样的
"""`操作符。您可以在这里阅读更多关于Java 13特性的信息。
qmb5sa225#
自Java 14起提供了三重引号功能。有关更多详细信息,请参见例如https://howtodoinjava.com/java14/java-text-blocks/
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中成为最终的和永久的,没有进一步的更改。
用法