从字符串中删除不需要的字符

检查字符串中是否包含不需要的字符的示例介绍了如何测试和拒绝不符合特定条件的字符串。显然,完全拒绝输入并不总是可行的,有时你只需要处理所收到的内容。在这些情况下,谨慎的开发人员将尝试清理提供的字符串,以删除可能导致进一步处理的任何字符。

要删除,修剪和替换不需要的角色,选择的武器将再次是番石榴的 CharMatcher 级。

删除字符

本节中感兴趣的两种方法是:

  • String retainFrom(CharSequence sequence)
    返回一个字符串,其中包含与 CharMatcher 实例匹配的所有字符。

  • String removeFrom(CharSequence sequence)
    返回一个字符串,其中包含与 CharMatcher 实例不匹配的所有字符。

作为一个例子,我们将使用 CharMatcher.digit(),这是一个预定义的 CharMatcher 实例,毫不奇怪,它只匹配数字。

String rock = "1, 2, 3 o'clock, 4 o'clock rock!";

CharMatcher.digit().retainFrom(rock); // "1234"
CharMatcher.digit().removeFrom(rock); // ", , o'clock, o'clock rock!"
CharMatcher.digit().negate().removeFrom(rock); // "1234"

本例中的最后一行说明 removeFrom 实际上是 retainFrom 的逆操作。在 CharMatcher 上调用 retainFrom 与在 CharMatcher 的否定版本上调用 removeFrom 具有相同的效果。

修剪前导和尾随字符

删除前导和尾随字符是一种非常常见的操作,最常用于从字符串中修剪空格。Guava 的 CharMatcher 提供这些修剪方法:

  • String trimLeadingFrom(CharSequence sequence)
    删除与 CharMatcher 实例匹配的所有前导字符。

  • String trimTrailingFrom(CharSequence sequence)
    删除与 CharMatcher 实例匹配的所有尾随字符。

  • String trimFrom(CharSequence sequence)
    删除与 CharMatcher 实例匹配的所有前导和尾随字符。

当与 CharMatcher.whitespace() 一起使用时,这些方法将有效地满足你的所有空白修剪需求:

CharMatcher.whitespace().trimFrom("   Too much space   "); // returns "Too much space"

替换字符

通常,应用程序将使用占位符字符替换特定情况下不允许的字符。要替换字符串中的字符,CharMatcher 的 API 提供以下方法:

  • String replaceFrom(CharSequence sequence, char replacement)
    用提供的替换字符替换与 CharMatcher 实例匹配的所有出现的字符。

  • String replaceFrom(CharSequence sequence, CharSequence replacement) 用提供的替换字符序列(字符串)替换与 CharMatcher 实例匹配的所有出现的字符。

  • String collapseFrom(CharSequence sequence, char replacement)
    用提供的替换字符的单个实例替换与 CharMatcher 实例匹配的连续字符组。

  • String trimAndCollapseFrom(CharSequence sequence, char replacement)
    collapseFrom 的行为相同,但是开头和结尾的匹配组被删除而不是替换。

让我们看一个演示这些方法的行为如何不同的示例。假设我们正在创建一个允许用户指定输出文件名的应用程序。为了清理用户提供的输入,我们创建了一个 CharMatcher 实例,它是预定义的空格 CharMatcher 和自定义 CharMatcher 的组合,它指定了我们宁愿在文件名中避免使用的一组字符。

CharMatcher illegal = CharMatcher.whitespace().or(CharMatcher.anyOf("<>:|?*\"/\\"));

现在,如果我们在一个急需清理的文件名上调用如下讨论的替换方法:

String filename = "<A::12> first draft???";

System.out.println(illegal.replaceFrom(filename, '_'));
System.out.println(illegal.collapseFrom(filename, '_'));
System.out.println(illegal.trimAndCollapseFrom(filename, '_'));

我们将在控制台中看到下面的输出。

_A__12___first_draft___
_A_12_first_draft_
A_12_first_draft