このクイックチュートリアルでは、GuavaのCharMatcherユーティリティクラスについて説明します。

1. 文字列から特殊文字を削除します

Stringからすべての特殊文字を削除することから始めましょう。

次の例では、 reservedFrom()を使用して、数字または文字ではないすべての文字を削除します。

@Test
public void whenRemoveSpecialCharacters_thenRemoved(){
    String input = "H*el.lo,}12";
    CharMatcher matcher = CharMatcher.javaLetterOrDigit();
    String result = matcher.retainFrom(input);

    assertEquals("Hello12", result);
}

2. 文字列から非ASCII文字を削除する

次の例のように、 CharMatcher を使用して、Stringから非ASCII文字を削除することもできます。

@Test
public void whenRemoveNonASCIIChars_thenRemoved() {
    String input = "あhello₤";

    String result = CharMatcher.ascii().retainFrom(input);
    assertEquals("hello", result);

    result = CharMatcher.inRange('0', 'z').retainFrom(input);
    assertEquals("hello", result);
}

3. 文字セットにない文字を削除する

次に、特定のCharsetに属していない文字を削除する方法を見てみましょう。 次の例では、「cp437」Charsetに属していない文字を削除します。

@Test
public void whenRemoveCharsNotInCharset_thenRemoved() {
    Charset charset = Charset.forName("cp437");
    CharsetEncoder encoder = charset.newEncoder();

    Predicate<Character> inRange = new Predicate<Character>() {
        @Override
        public boolean apply(Character c) {
            return encoder.canEncode(c);
        }
    };

    String result = CharMatcher.forPredicate(inRange)
                               .retainFrom("helloは");
    assertEquals("hello", result);
}

注: CharsetEncoder を使用して、指定されたCharacterを指定されたCharsetにエンコードできるかどうかをチェックするPredicateを作成しました。

4. 文字列を検証します

次へ– CharMatcherを使用してStringを検証する方法を見てみましょう。

matchesAllOf()を使用して、すべての文字が条件に一致するかどうかを確認できます。 また、 matchesNoneOf()を使用して、String文字のいずれにも条件が適用されないかどうかを確認できます。

次の例では、 String が小文字であり、少なくとも1つの’ e ‘文字を含み、数字を含まないかどうかを確認します。

@Test
public void whenValidateString_thenValid(){
    String input = "hello";

    boolean result = CharMatcher.javaLowerCase().matchesAllOf(input);
    assertTrue(result);

    result = CharMatcher.is('e').matchesAnyOf(input);
    assertTrue(result);

    result = CharMatcher.javaDigit().matchesNoneOf(input);
    assertTrue(result);
}

5. トリム文字列

では、CharMatcherを使用してStringをトリミングする方法を見てみましょう。

次の例では、 trimLeading() TrimTrailing 、および trimFrom()を使用して、Stringをトリミングします。

@Test
public void whenTrimString_thenTrimmed() {
    String input = "---hello,,,";

    String result = CharMatcher.is('-').trimLeadingFrom(input);
    assertEquals("hello,,,", result);

    result = CharMatcher.is(',').trimTrailingFrom(input);
    assertEquals("---hello", result);

    result = CharMatcher.anyOf("-,").trimFrom(input);
    assertEquals("hello", result);
}

6. 文字列を折りたたむ

次へ– CharMatcherを使用してStringを折りたたむ方法を見てみましょう。

次の例では、 collapsFrom()を使用して、連続するスペースを「」に置き換えます。

@Test
public void whenCollapseFromString_thenCollapsed() {
    String input = "       hel    lo      ";

    String result = CharMatcher.is(' ').collapseFrom(input, '-');
    assertEquals("-hel-lo-", result);

    result = CharMatcher.is(' ').trimAndCollapseFrom(input, '-');
    assertEquals("hel-lo", result);
}

7. 文字列から置き換えます

次の例のように、 CharMatcher を使用して、Stringの特定の文字を置き換えることができます。

@Test
public void whenReplaceFromString_thenReplaced() {
    String input = "apple-banana.";

    String result = CharMatcher.anyOf("-.").replaceFrom(input, '!');
    assertEquals("apple!banana!", result);

    result = CharMatcher.is('-').replaceFrom(input, " and ");
    assertEquals("apple and banana.", result);
}

8. 文字の出現をカウントする

最後に、CharMatcherを使用して文字の出現をカウントする方法を見てみましょう。

次の例では、’ a ‘の間のコンマと文字をカウントします:’ h ‘:

@Test
public void whenCountCharInString_thenCorrect() {
    String input = "a, c, z, 1, 2";

    int result = CharMatcher.is(',').countIn(input);
    assertEquals(4, result);

    result = CharMatcher.inRange('a', 'h').countIn(input);
    assertEquals(2, result);
}

9. 結論

この記事では、GuavaforStringsを使用した場合のより便利なAPIと実際の使用例をいくつか説明しました。

完全なソースコードは、GitHubから入手できます。