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.ASCII | Ký tự ASCII |
CharMatcher.BREAKING_WHITESPACE | Whitespace ngắt dòng |
CharMatcher.DIGIT | Chữ số (0-9) |
CharMatcher.JAVA_DIGIT | Chữ số theo Java (Unicode digit) |
CharMatcher.JAVA_LETTER | Chữ cái theo Java |
CharMatcher.JAVA_LOWER_CASE | Chữ thường theo Java |
CharMatcher.JAVA_UPPER_CASE | Chữ hoa theo Java |
CharMatcher.NONE | Không khớp ký tự nào |
CharMatcher.ANY | Khớp mọi ký tự |
CharMatcher.SINGLE_WIDTH | Ký tự đơn (không fullwidth) |
CharMatcher.WHITESPACE | Khoả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.