1. 概述

当我们刚开始学习 Java 时,可能会看到第一个示例:“Hello World!”。我们知道,如果我们把一个 String 对象传递给 System.out.println() 方法,Java 就会在控制台输出这个字符串。

然而,有时我们希望输出的字符串带有引号("...")。在这篇简短教程中,我们将探讨如何实现这一点。

2. 用两个转义引号包裹

如果我们想在输出中包含引号,最直接的想法是将引号连接到给定文本的开头和结尾。

在 Java 中,当我们使用字符串值时,必须对它进行引用,例如 System.out.println("Hello World!");。但是,我们不能像 "”” 这样在字符串中放入引号字符。Java 不接受这种形式。因此,在这种情况下,我们必须在字符串中 **转义引号符号:"\\\""**。

接下来,让我们尝试一个输入示例:

String theySay = "All Java programmers are cute!";
String quoted = "\"" + theySay + "\"";

System.out.print(quoted);

运行上面的程序后,我们可以看到带有引号的输出:

"All Java programmers are cute!"

3. 在单元测试中验证输出

通常,我们会编写单元测试来验证方法是否按预期工作。但在这个例子中,我们需要验证的是打印到控制台的输出。为了验证输出,我们可以 替换 System.out 为另一个使用 ByteArrayOutputStream 作为 OutputStreamPrintStream 对象:

final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
final PrintStream originalOut = System.out;

@BeforeEach
void replaceOut() {
    System.setOut(new PrintStream(outContent));
}

@AfterEach
void restoreOut() {
    System.setOut(originalOut);
}

@BeforeEach@AfterEach 是来自 JUnit 5 的注解。这些注解的方法将在每个测试方法执行前后被调用。

现在,如果我们在测试方法中放入原始的输出代码,就可以验证打印的输出了:

String theySay = "All Java programmers are cute!";
String quoted = "\"" + theySay + "\"";

System.out.println(quoted);

//assertion
String expected = "\"All Java programmers are cute!\"\n";
assertEquals(expected, outContent.toString());

如果运行测试,它会通过。因此,为了简洁起见,后续的例子中我们将使用单元测试断言来验证 System.out 打印的内容。

4. 使用 replaceAll() 方法

标准的 String.replaceAll() 方法可以通过正则表达式执行字符串替换操作。我们已经通过在输入字符串的开头和结尾添加引号解决了这个问题。

遵循同样的思路,我们可以使用 replaceAll() 方法来实现:

String theyAsk = "Can you write Java code?";
String quoted = theyAsk.replaceAll("^|$","\"" );

System.out.println(quoted);

//assertion
String expected = "\"Can you write Java code?\"\n";
assertEquals(expected, outContent.toString());

上述示例显示了正则表达式 "^|$" 匹配输入字符串的开头和结尾。因此,replaceAll() 方法用引号替换匹配项。

5. 用两个引号包裹

到目前为止,我们已经学到了两种将字符串包裹在引号中的方法。两种方法都像 "\\\"" 一样在字符串中转义引号字符。它们确实可以正常工作。然而,使用转义字符可能会使代码更难阅读和理解。

为了避免 转义引号字符,我们可以使用 char 而不是字符串

String weSay = "Yes, we can write beautiful Java codes!";
String quoted = '"' + weSay + '"';
System.out.println(quoted);

//assertion
String expected = "\"Yes, we can write beautiful Java codes!\"\n";
assertEquals(expected, outContent.toString());

如果运行测试,它也会通过。如上所述,我们在测试中执行了两个 char 和一个 String 的加法操作:'\"' + weSay + '\"'。这是因为 Java 自动将 char 转换为 String,然后与字符串 weSay 进行连接,所以不需要转义。

6. 总结

在这篇文章中,我们探讨了三种不同的方法,用于在输出中打印带有引号 (") 的字符串:

  1. "\\\"\" + input + "\\\"\" - 在输入字符串的开头和结尾添加一个转义引号字符串
  2. input.replaceAll("^|$", "\\\\") - 使用基于正则表达式的 replaceAll() 方法
  3. '\"' + input + '\"' - 类似于第一种解决方案,但使用 char 而不是 String 来避免转义

此外,我们还学习了如何在单元测试中验证 System.out.println() 输出的内容。

如往常一样,这里展示的所有代码片段可以在 GitHub 上找到。