從字串中刪除不需要的字元

檢查字串中是否包含不需要的字元的示例介紹瞭如何測試和拒絕不符合特定條件的字串。顯然,完全拒絕輸入並不總是可行的,有時你只需要處理所收到的內容。在這些情況下,謹慎的開發人員將嘗試清理提供的字串,以刪除可能導致進一步處理的任何字元。

要刪除,修剪和替換不需要的角色,選擇的武器將再次是番石榴的 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