在Java中,有没有办法在不必转义引号的情况下编写字符串文字?

时间:2010-06-13 22:45:54

标签: java string escaping

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

在某些语言中,您可以这样做:

foo = '"Hello, World"';

但是,在Java中,''用于char,因此您不能以String方式使用它。有些语言有解决此问题的语法。例如,在python中,您可以这样做:

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

Java有类似的东西吗?

8 个答案:

答案 0 :(得分:130)

不,我一直对Java中缺少不同的字符串文字语法感到恼火。

这是我不时使用的一个技巧:

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

我主要只为静态字段做类似的事情。由于它是静态的,因此在初始化类时,字符串替换代码会被调用一次。因此,运行时性能损失实际上是不存在的,并且它使代码更加清晰。

答案 1 :(得分:68)

答案是否定的,证据在于 Java语言规范

  StringLiteral:
   "StringCharacters"

  StringCharacters:
   StringCharacter
   | StringCharacters StringCharacter

  StringCharacter:
   InputCharacter but not " or \
   | EscapeSequence

正如您所看到的,StringLiteral可以被"绑定,并且不能包含没有转义的特殊字符..

附注:您可以在项目中嵌入Groovy,这将扩展Java的语法,允许您使用'''multi line string '''' "string with single quotes" '"string with ${variable}"。< / p>

答案 2 :(得分:7)

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

原始字符串文字(位于amber list上)不会进入JDK 12 请参阅criticisms here

Java的未来版本可能有10个或更多。

请参阅2018年1月的JEPS 8196004 :( "JEP" is the "JDK Enhancement Program"

  

JEP草案:原始字符串文字

     

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

所以而不是:

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`));

纯!

但它仍然是just a draft:在完成并进入下一个JDK之前,它需要发布,提交,成为候选人并获得资助。

答案 3 :(得分:5)

您也可以使用apache commons中的StringEscapeUtils

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

答案 4 :(得分:4)

简单回答:不。

对于必须转义的较长字符串,我通常会从某些外部资源中读取它们。

答案 5 :(得分:2)

从Java 13开始,有一个称为“文本块”的新功能。它看起来类似于您提到的python中可用的内容:

String text = """
              {
                 "property": "value",
                 "otherProperty": 12
              }
              """;

有关示例的更多详细信息,请参见:https://openjdk.java.net/jeps/355

答案 6 :(得分:-3)

以下似乎对我有用:

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

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

答案 7 :(得分:-4)

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

String text = ...

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