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
作为 OutputStream
的 PrintStream
对象:
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. 总结
在这篇文章中,我们探讨了三种不同的方法,用于在输出中打印带有引号 ("
) 的字符串:
"\\\"\" + input + "\\\"\"
- 在输入字符串的开头和结尾添加一个转义引号字符串input.replaceAll("^|$", "\\\\")
- 使用基于正则表达式的replaceAll()
方法'\"' + input + '\"'
- 类似于第一种解决方案,但使用char
而不是String
来避免转义
此外,我们还学习了如何在单元测试中验证 System.out.println()
输出的内容。
如往常一样,这里展示的所有代码片段可以在 GitHub 上找到。