Java 中的三重引号,如 Scala
Triple quotes in Java like Scala
在 Scala 中你可以这样做:
val expr = """ This is a "string" with "quotes" in it! """
Java里有这样的东西吗?我讨厌使用 "\""
来表示带有引号的字符串。尤其是在 JSON 中组合 key/value 对时。恶心!
除了使用 \"
在字符串文字中包含双引号外,没有其他好的选择。
有不好的选择:
- 使用
\u0022
,双引号字符的 Unicode 转义。编译器将 Unicode 转义视为键入该字符。它在 源代码 、ending/beginning 和 String
文字中被视为双引号字符,因此这不起作用。
- 连接字符
'"'
,例如"This is a " + '"' + "string"
。这会起作用,但它似乎比仅使用 \"
. 更丑陋且可读性更差
- 连接
char
34 表示双引号字符,例如"This is a " + (char) 34 + "string"
。这会起作用,但是您试图在字符串中放置一个双引号字符就更不明显了。
- 复制并粘贴 Word 的 "smart quotes",例如
"This is a “string” with “quotes” in it!"
。这些不是相同的字符(Unicode U+201C 和 U+201D);它们有不同的外观,但它们会起作用。
我想隐藏 "disgusting"-ness,你可以将它隐藏在常量后面。
public static final String DOUBLE_QUOTE = "\"";
那么你可以使用:
String expr = " This is a " + DOUBLE_QUOTE + "string" + DOUBLE_QUOTE + ...;
它比其他选项更具可读性,但它仍然不是很可读,而且仍然很难看。
Java中没有"""
机制,所以使用转义\"
是最好的选择。它是最易读的,也是最不丑陋的。
在做同样的事情时发现了这个问题:composing small literal JSON strings for quick testing。一种没有出现的替代方法是使用双单引号并将它们替换为双引号,例如:
String json = "{ ''label'' : ''set range'', ''min'' : 0, ''max'' : 100}".replace("''", "\"")
显然,如果存在常规的双单引号,这将不起作用,但这种可能性很小。这不是一个很好的解决方案,但看起来比很多反斜杠要好,imo。作为将 json 放入单独文件的中间步骤,这可能还不错。
Since Java 13 preview feature
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;
""";
这将产生 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.""";
注意:此功能是预览版,因此您不能在Java13中使用它,除非您设置--enable-preview TextBlock
键。
更新: 该功能转到 the second preview (JEP 368) 和 Java 14.
将等待 Java 15.
"Raw String Literals"
的功能原本应该在 Java 12 中,但由于一些批评而被 withdrawn,因为他们计划使用可变数量的反引号 (`).
所以它在 Java 13 最后,作为 "Text Block"
功能,但仅在 preview 中。它像 Scala 一样使用 """
运算符。
您可以阅读更多关于 Java 13 项功能 here。
在 Scala 中你可以这样做:
val expr = """ This is a "string" with "quotes" in it! """
Java里有这样的东西吗?我讨厌使用 "\""
来表示带有引号的字符串。尤其是在 JSON 中组合 key/value 对时。恶心!
除了使用 \"
在字符串文字中包含双引号外,没有其他好的选择。
有不好的选择:
- 使用
\u0022
,双引号字符的 Unicode 转义。编译器将 Unicode 转义视为键入该字符。它在 源代码 、ending/beginning 和String
文字中被视为双引号字符,因此这不起作用。 - 连接字符
'"'
,例如"This is a " + '"' + "string"
。这会起作用,但它似乎比仅使用\"
. 更丑陋且可读性更差
- 连接
char
34 表示双引号字符,例如"This is a " + (char) 34 + "string"
。这会起作用,但是您试图在字符串中放置一个双引号字符就更不明显了。 - 复制并粘贴 Word 的 "smart quotes",例如
"This is a “string” with “quotes” in it!"
。这些不是相同的字符(Unicode U+201C 和 U+201D);它们有不同的外观,但它们会起作用。
我想隐藏 "disgusting"-ness,你可以将它隐藏在常量后面。
public static final String DOUBLE_QUOTE = "\"";
那么你可以使用:
String expr = " This is a " + DOUBLE_QUOTE + "string" + DOUBLE_QUOTE + ...;
它比其他选项更具可读性,但它仍然不是很可读,而且仍然很难看。
Java中没有"""
机制,所以使用转义\"
是最好的选择。它是最易读的,也是最不丑陋的。
在做同样的事情时发现了这个问题:composing small literal JSON strings for quick testing。一种没有出现的替代方法是使用双单引号并将它们替换为双引号,例如:
String json = "{ ''label'' : ''set range'', ''min'' : 0, ''max'' : 100}".replace("''", "\"")
显然,如果存在常规的双单引号,这将不起作用,但这种可能性很小。这不是一个很好的解决方案,但看起来比很多反斜杠要好,imo。作为将 json 放入单独文件的中间步骤,这可能还不错。
Since Java 13 preview feature
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;
""";
这将产生 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.""";
注意:此功能是预览版,因此您不能在Java13中使用它,除非您设置--enable-preview TextBlock
键。
更新: 该功能转到 the second preview (JEP 368) 和 Java 14.
将等待 Java 15.
"Raw String Literals"
的功能原本应该在 Java 12 中,但由于一些批评而被 withdrawn,因为他们计划使用可变数量的反引号 (`).
所以它在 Java 13 最后,作为 "Text Block"
功能,但仅在 preview 中。它像 Scala 一样使用 """
运算符。
您可以阅读更多关于 Java 13 项功能 here。