Java中等同于C#的verbatim字符串(使用@符号)是什么?

108

快速问题。在Java中是否有适用于字符串的@等效项:

例如,在C#中我可以做@"c:\afolder\afile",并且在处理时忽略转义字符,而不是必须执行"c:\\afolder\\aFile"。是否有Java等效项?

嗯:stackoverflow把我弄糊涂了..哈哈。第二个例子应该这样写:

c:(双反斜杠)afolder(双反斜杠)aFile


3
可能是重复问题:https://dev59.com/rHI-5IYBdhLWcg3wF0Qc中是否有字符可用于转义字符串中的引号/2018583#2018583。 - codaddict
2
由于“@”符号也可以用作标识符来使用语言关键字,因此我冒昧澄清了标题。 - Joey
@unicornaddict - 是的,确实是同一个问题。抱歉,在搜索时没有看到。 @ Johannes - 做得好..谢谢。 - Simon Rigby
如果你想在Windows上做到这一点,并且你使用的是Windows XP或更新版本(你应该这样做!),那么你可以只需执行File file = new File("C:/afolder/afile")。 另一方面,如果你想更具可移植性,你应该看看@CPerkins的优秀答案。 - Haakon Løtveit
注意(2018年1月),原始字符串字面量可能会在Java(JDK 10或更高版本)中推出:请参见在Java中,有没有一种方法可以编写字符串文字而不必转义引号? - VonC
5个回答

81

不是。转义/外部化字符串是您唯一的选择。


10
我喜欢 C# 6,特别是带有 @"string" 和 $"string{i}" 的功能,比 Java 更具未来性。 - afruzan
13
从C#转到Java,在许多方面通常是一种退步。 - MikeKulls
1
看到这真是令人伤心。 - Mr_Hmp

35

第一个链接(verbatim string literals)指向“Visual Studio 2003退役技术文档”。groovy.codehaus.org的链接已经失效。 - Vladas Maier
1
@ace:已更新至当前的“字符串”文章,其中包括关于逐字字符串字面量的部分。同时更新了Groovy链接。 - Jon Skeet

17

正如Kent和Jon所说,答案是否定的。

我回答只是为了指出即使有,对于您的特定情况,在通常情况下都是一个不好的想法,假设不仅是一次性程序。

Java程序在除Windows之外的更多平台上运行,其他平台具有不同的文件分隔符。因此,处理转义反斜杠的正确方法是通过获取文件分隔符属性来处理您的特定示例:


    String sep = System.getProperty("file.separator");
    String filename = ROOTDIR + sep + "folder" + sep + "afile";

在这种情况下,您需要根据某些策略分别创建ROOTDIR - 不仅仅是平台,还包括您希望您的“afile”相对于实际文件系统根目录还是相对于用户主目录。

但是无论如何,使用文件分隔符属性可以使您的程序更广泛地可用。 这需要更多的工作吗? 是的。 正如Wanda Sykes所说,“但它是值得的”。


1
嗨,谢谢。在我的情况下,“文件名”这个事实有点不相关。我的所有代码所做的就是获取一个字符串(或尝试获取)并将其传递。我实际上除了将其传递给Web服务之外什么也没做。我正在测试从Java调用的C# WCF服务的响应。因为我只是硬编码了一个测试,所以在这一点上我发现了这个限制。我实际上没有对该字符串进行任何“基于文件”的操作。 - Simon Rigby
2
逐字字符串非常适用于正则表达式模式。 - Gordon Bean

12

目前Java还不支持,但可能在未来的版本中会提供。2018/01/23创建了JEP 326:原始字符串字面量

请查看进展情况:https://bugs.openjdk.java.net/browse/JDK-8196004

也许将来有一天您将能够使用以下内容实现:

`c:\afolder\afile`

更新: JEP建议从JDK 12:326中删除原始字符串文字(预览版)。 您可以在此处阅读其原因:http://mail.openjdk.java.net/pipermail/jdk-dev/2018-December/002402.html

更多详细信息请参见https://bugs.openjdk.java.net/browse/JDK-8215682

重点:Java不会在近期支持原样字符串。即使出现,也不太可能使用``符号。


1
由于这是关于该问题最受欢迎的讨论之一,JEP 326已被撤回。该讨论在2019年1月重新开始(https://mail.openjdk.java.net/pipermail/amber-spec-experts/2019-January/000931.html),现在在[JEP 355](https://openjdk.java.net/jeps/355)中跟踪以发布JDK13。 - NPras

10

自2019年9月起,Java就拥有了它,但使用的是不同的语法。 """(三个双引号标记)。

*在更近期的Java版本中(+13预览版,+15生产环境可用),可以使用Java文本块实现基本相同的功能。

String html = """         
            <xml>
                <ody>
                    <pan>example xml </pan>
                </ody>
            </xml>""";

有关 https://docs.oracle.com/en/java/javase/13/text_blocks/index.html 的文档。


这应该现在被接受为正确答案。 - cesarse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接