在Java中,是否有一种无需转义引号就能编写字符串文字的方法?


111

假设您有一个字符串文字,里面带有很多引号。您可以将它们全部逃脱,但这很痛苦,而且很难阅读。

在某些语言中,您可以执行以下操作:

foo = '"Hello, World"';

但是,在Java中,''它用于char,因此您不能以String这种方式将其用于s。某些语言具有解决此问题的语法。例如,在python中,您可以执行以下操作:

"""A pretty "convenient" string"""

Java是否有类似的东西?



此答案显示了如何在Eclispe中粘贴多行转义字符串。
杰夫·阿克塞尔罗德

2
更新2018:Java的原始字符串文字可能会出现。请参阅下面的答案
VonC

然后导入jackson ObjectMapper System.out.println(mapperObj.writeValueAsString(mapperObj.readValue(str, Object.class)));
Kervvv

更新Q4 2018:原始字符串字面是来了,只是还没有。请参阅我的最新答案
VonC

Answers:


74

答案是否定的,证明位于Java语言规范中

  StringLiteral:
   "StringCharacters"

  StringCharacters:
   StringCharacter
   | StringCharacters StringCharacter

  StringCharacter:
   InputCharacter but not " or \
   | EscapeSequence

如您所见,a StringLiteral只能由绑定,"并且不能包含特殊字符且不进行转义。

旁注:你可以嵌入Groovy的项目里面,这会扩展Java的语法让您的使用'''multi line string '''' "string with single quotes" '"string with ${variable}"


141

不,我一直为Java中缺少不同的字符串文字语法而烦恼。

这是我不时使用的技巧:

String myString = "using `backticks` instead of quotes".replace('`', '"');

我主要只对静态字段执行类似的操作。由于它是静态的,因此在初始化类后,将一次调用字符串替换代码。因此,几乎不存在运行时性能损失,并且这使代码更加清晰易读。


您不需要使用replaceAll吗?
兰登·库恩

10
@ landon9720否,.replace将所有出现的字符/字符序列替换为另一个字符/字符序列。.replaceAll使用正则表达式。
abelito

出于好奇,您是否知道Java编译器在编译时是否会简化此过程?
ug_ 2014年

2
不,我认为编译器不会简化此过程。但这并不重要。这是一个非常便宜的调用,如果我仅对静态最终字符串执行此操作,则在类加载时仅产生一次费用。这是我通常愿意为看起来更好的代码付出的代价:)
benjismith

3
那么myString中的“ \”呢?
安徒生

10

更新2018年12月(12个月后):

原始字符串文字(在琥珀色列表中)不会进入JDK12。
请参阅此处批评


将来可能会有Java版本(10个或更多)。

请参阅自2018年1月起的JEPS 8196004:(“ JEP”是“ JDK增强计划”

JEP草案:原始字符串文字

向Java编程语言中添加一种新的文字,即原始字符串文字。
像传统的字符串文字一样,原始字符串文字会生成String,但不会解释字符串转义符,并且可以跨越多行源代码

所以代替:

Runtime.getRuntime().exec("\"C:\\Program Files\\foo\" bar");
String html = "<html>\n"
              "    <body>\n" +
              "         <p>Hello World.</p>\n" +
              "    </body>\n" +
              "</html>\n";
System.out.println("this".matches("\\w\\w\\w\\w"));

您将能够输入:

Runtime.getRuntime().exec(`"C:\Program Files\foo" bar"`);
    
String html = `<html>
                   <body>
                       <p>Hello World.</p>
                   </body>
               </html>
              `;

System.out.println("this".matches(`\w\w\w\w`));

整齐!

但是,它仍然只是草稿:在完成并将其纳入下一个JDK之前,将需要发布,提交,成为候选人并提供资金。



4

您还可以使用来自Apache Commons的StringEscapeUtils

更新:如果有人对某些示例感兴趣,这里是一个有用的链接:https : //dzone.com/articles/commons-lang-3-improved-and-powerful-StringEscapeUtils


2
您能否根据这个问题添加一个示例,说明如何解决该问题?
Bengt

3
仅引用可能回答该问题的其他资源被认为是次优的。请考虑使用与问题匹配的示例来总结链接页面。
Bengt 2013年

我看了一眼,也不认为任何一个都能真正回答问题。静态方法的输入为Strings,因此无法在代码中获得格式正确的值。大概您可以使用这些方法将文件从中读取到中String,但我认为这不是问题。
汤姆·哈里森

链接的类(org.apache.commons.lang3.StringEscapeUtils)已被弃用,并替换为org.apache.commons.text.StringEscapeUtils
jcarter

-4

以下内容似乎对我有用:

String x = "Some Text" + '"' + "More Text" + '"' + "Even More Text";

我认为因为char是String的原始变量类型,所以可以将Strings和chars组合在一起(至少eclipse编译器似乎没有抱怨)。


1
我认为因为char是String <-的原始变量类型,所以您的假设是错误的。为此,它也可以使用其他类型,例如int,如下所示:String x =“ Some text” + 33 +“ More text”;
Najeeb

-6

如果要转义'"在字符串中,可以使用以下代码:

String text = ...

text = text.replaceAll("('|\")", "\\\\$1");

该问题询问源代码中的字符串文字。抱歉,请再试一次。
michaelb958--GoFundMonica13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.