1. 引言

非打印的Unicode字符包括控制字符、样式标记和其他在文本中可见但不显示的符号。这些字符可能会导致文本处理、显示和保存出现问题。因此,我们需要方法来根据需要替换或移除这些字符。

在这篇教程中,我们将探讨替换它们的不同方法。

2. 使用正则表达式

Java的String类提供了强大的文本处理方式,而正则表达式(/regular-expressions-java)为我们提供了一种快速匹配和替换字符串模式的方法。我们可以使用简单的模式来查找并替换非打印的Unicode字母,如下所示:

@Test
public void givenTextWithNonPrintableChars_whenUsingRegularExpression_thenGetSanitizedText() {
    String originalText = "\n\nWelcome \n\n\n\tto Baeldung!\n\t";
    String expected = "Welcome to Baeldung!";
    String regex = "[\\p{C}]";

    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(originalText);
    String sanitizedText = matcher.replaceAll("");

    assertEquals(expected, sanitizedText);
}

在这个测试方法中,正则表达式\p{C}表示给定的originalText中的任何控制字符(非打印Unicode字符)。我们首先使用Pattern.compile(regex)方法将正则表达式编译为模式,然后通过将originalText作为参数传递给这个模式创建一个Matcher对象。

然后,我们调用Matcher.replaceAll()方法,将所有匹配到的控制字符替换为空字符串,从而从源文本中删除它们。最后,我们使用assertEquals()方法比较simplifiedText与预期的字符串。

3. 自定义实现

我们还可以采用另一种方法,遍历文本中的每个字符并根据其数值移除特殊Unicode字符。让我们看一个简单示例:

@Test
public void givenTextWithNonPrintableChars_whenCustomImplementation_thenGetSanitizedText() {
    String originalText = "\n\nWelcome \n\n\n\tto Baeldung!\n\t";
    String expected = "Welcome to Baeldung!";

    StringBuilder strBuilder = new StringBuilder();
    originalText.codePoints().forEach((i) -> {
        if (i >= 32 && i != 127) {
            strBuilder.append(Character.toChars(i));
        }
    });

    assertEquals(expected, strBuilder.toString());
}

这里,我们使用originalText.codePoints()forEach循环遍历原始文本的Unicode代码。接着,我们设置条件,排除值小于32和等于127的字符,分别代表非打印和控制字符。

然后,我们使用strBuilder.append(Character.toChars(i))方法将字符添加到StringBuilder对象中。

4. 总结

总之,本教程深入探讨了如何处理书面文本中非打印Unicode字符带来的挑战。研究涵盖了利用Java String类中的正则表达式和实施自定义解决方案的两种不同方法。

如往常一样,本文的完整代码示例可在GitHub上找到。