Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Lớp CharMatcher trong Java (Guava)

CharMatcher là một lớp tiện ích trong thư viện Google Guava dùng để xác định một ký tự char có thỏa mãn điều kiện nào đó (trả về true/false), tương tự như Predicate<Character> nhưng làm việc trên kiểu primitive char thay vì object Character.

Lưu ý: Từ Guava 21.0+, CharMatcher đã bị deprecated thay thế bởi các API chuẩn của Java 8+ (Character, Predicate, Stream API). Tuy nhiên nó vẫn phổ biến trong các codebase cũ.

Các phương thức chính

STT Phương thức & Mô tả
1 and(CharMatcher other) - Trả về matcher khớp khi CẢ HAI matcher này và other đều khớp.
2 static anyOf(CharSequence sequence) - Trả về matcher khớp bất kỳ ký tự nào có trong chuỗi cho trước.
3 apply(Character character) - Deprecated. Dùng matches(char) thay thế.
4 collapseFrom(CharSequence sequence, char replacement) - Thay thế mỗi nhóm ký tự liên tiếp khớp bằng 1 ký tự replacement.
5 countIn(CharSequence sequence) - Đếm số ký tự khớp trong chuỗi.
6 static forPredicate(Predicate<? super Character> predicate) - Chuyển Predicate<Character> thành CharMatcher.
7 indexIn(CharSequence sequence) - Trả về index ký tự khớp đầu tiên, hoặc -1 nếu không có.

Các hằng số (Predefined Matchers) thường dùng

Hằng sốMô tả
CharMatcher.ASCIIKý tự ASCII
CharMatcher.BREAKING_WHITESPACEWhitespace ngắt dòng
CharMatcher.DIGITChữ số (0-9)
CharMatcher.JAVA_DIGITChữ số theo Java (Unicode digit)
CharMatcher.JAVA_LETTERChữ cái theo Java
CharMatcher.JAVA_LOWER_CASEChữ thường theo Java
CharMatcher.JAVA_UPPER_CASEChữ hoa theo Java
CharMatcher.NONEKhông khớp ký tự nào
CharMatcher.ANYKhớp mọi ký tự
CharMatcher.SINGLE_WIDTHKý tự đơn (không fullwidth)
CharMatcher.WHITESPACEKhoảng trắng

Ví dụ minh họa

import com.google.common.base.CharMatcher;

public class GuavaTester {
    public static void main(String args[]) {
        // Chỉ giữ lại chữ số
        System.out.println(CharMatcher.DIGIT.retainFrom("mahesh123")); 
        // Output: 123

        // Cắt whitespace 2 đầu, gộp whitespace giữa thành 1 space
        System.out.println(CharMatcher.WHITESPACE.trimAndCollapseFrom(" Mahesh Parashar ", ' ')); 
        // Output: Mahesh Parashar

        // Thay thế chữ số bằng *
        System.out.println(CharMatcher.JAVA_DIGIT.replaceFrom("mahesh123", "*")); 
        // Output: mahesh***

        // Giữ lại chữ số HOẶC chữ thường
        System.out.println(CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom("mahesh123")); 
        // Output: mahesh123
    }
}

Kết quả

123
Mahesh Parashar
mahesh***
mahesh123

Các phương thức hữu ích khác

  • retainFrom(CharSequence) - Giữ lại chỉ các ký tự khớp, loại bỏ phần còn lại.
  • removeFrom(CharSequence) - Loại bỏ các ký tự khớp.
  • replaceFrom(CharSequence, CharSequence) - Thay thế ký tự khớp bằng chuỗi khác.
  • trimFrom(CharSequence) - Cắt ký tự khớp ở 2 đầu chuỗi.
  • trimLeadingFrom / trimTrailingFrom - Cắt đầu / cuối.
  • collapseFrom(CharSequence, char) - Gộp chuỗi ký tự khớp liên tiếp thành 1 ký tự.
  • or(CharMatcher) / and(CharMatcher) / negate() - Kết hợp logic.

Hiện đại hóa (Java 8+ không cần Guava)

// Thay CharMatcher.DIGIT.retainFrom(s)
String digitsOnly = s.chars()
    .filter(Character::isDigit)
    .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
    .toString();

// Thay CharMatcher.WHITESPACE.trimAndCollapseFrom(s, ' ')
String collapsed = s.trim().replaceAll("\\s+", " ");

// Thay CharMatcher.JAVA_DIGIT.replaceFrom(s, "*")
String starred = s.replaceAll("\\d", "*");

// Thay CharMatcher.or().retainFrom(s)
String filtered = s.chars()
    .filter(c -> Character.isDigit(c) || Character.isLowerCase(c))
    .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
    .toString();

Lợi ích Java 8+

  • Không cần dependency bên ngoài.
  • Hỗ trợ Unicode tốt hơn.
  • Code rõ ràng, functional style.
  • Hiệu năng tốt nhờ Stream API.