Guava CharMatcher 源码分析

CharMatcher

CharMatcher提供了多种对字符串处理的方法,大概分为找到匹配的字符串和处理匹配的字符串两种。其中内部实现了大量的公用内部类,用来方便用户对字符串进行匹配,并且实现了大量处理字符串的方法。

CharMatcher本身是一个抽象类,也有一些抽象方法,它主要依靠内部继承ChatMatcher的内部子类来是想抽象方法和重写一些方法。

1. 内部实现类

CharMatcher的内部实现类可以进行字符串的匹配。

// 以JavaDigital为例
// 匹配Unicode数字
// 1. 静态工厂,返回JavaDigital实例
public static CharMatcher javaDigit() {
    return JavaDigit.INSTANCE;
}
// 2. 静态常量,初始化调用1
public static final CharMatcher JAVA_DIGIT = javaDigit();

// 实现
private static final class JavaDigit extends CharMatcher {
    
    static final JavaDigit INSTANCE = new JavaDigit();

    @Override
    public boolean matches(char c) {
        return Character.isDigit(c);
    }

    @Override
    public String toString() {
        return "CharMatcher.javaDigit()";
    }
}

/**
 * CharMatcher的内部类均采用以上形式实现以及调用
 */
ANY: 匹配任何字符
ASCII: 匹配是否是ASCII字符
BREAKING_WHITESPACE: 匹配所有可换行的空白字符(不包括非换行空白字符,例如"\u00a0")
DIGIT: 匹配ASCII数字 
INVISIBLE: 匹配所有看不见的字符
JAVA_ISO_CONTROL: 匹配ISO控制字符, 使用 Charater.isISOControl() 实现
JAVA_LETTER: 匹配字母, 使用 Charater.isLetter() 实现
JAVA_LETTER_OR_DIGET: 匹配数字或字母
JAVA_LOWER_CASE: 匹配小写
JAVA_UPPER_CASE: 匹配大写
NONE: 不匹配所有字符
SINGLE_WIDTH: 匹配单字宽字符, 如中文字就是双字宽
WHITESPACE: 匹配所有空白字符

常用操作方法

CharMatcher提供了一些对字符串进行处理的方法。

// 返回匹配指定字符match的Matcher
CharMatcher is(char match);

// 返回不匹配指定字符match的Matcher
CharMatcher isNot(char match);

// 返回匹配sequence中任意字符的Matcher
CharMatcher anyOf(CharSequence sequence);

// 返回不匹配sequence中任何一个字符的Matcher
CharMatcher noneOf(CharSequence sequence);

// 返回匹配范围内任意字符的Matcher
CharMatcher inRange(char startInclusive, char endIncludesive);

// 返回使用predicate的apply()判断匹配的Matcher
CharMatcher forPredicate(Predicate<? super Charater> predicate);

// 返回以当前Matcher判断规则相反的Matcher
CharMatcher negate();

// 返回与other匹配条件组合做与来判断的Matcher
CharMatcher and(CharMatcher other);

// 返回与other匹配条件组合做或来判断的Matcher
CharMatcher or(CharMatcher other);

// 只要sequence中有任意字符能匹配Matcher,返回true
boolean matchesAnyOf(CharSequence sequence);

// 如果sequence中所有字符都能匹配Matcher,返回true
boolean matchesAllOf(CharSequence sequence);

//  如果sequence中所有字符都不能匹配Matcher,返回true
boolean matchesNoneOf(CharSequence sequence);

// 返回sequence中匹配到的第一个字符的下标
int indexIn(CharSequence sequence);

// 返回从start开始,在sequence中匹配到的第一个字符的下标
int indexIn(CharSequence sequence, int start);

// 返回sequence中最后一次匹配到的字符下标
int lastIndexIn(CharSequence sequence);

// 返回sequence中匹配到的字符总数
int countIn(CharSequence sequence);

// 删除sequence中匹配到的字符并返回
String removeFrom(CharSequence sequence);

// 保留sequence中匹配到的字符并返回
String retainFrom(CharSequence sequence);

// 替换sequence中匹配到的字符并返回
String replaceFrom(CharSequence sequence, char replacement);

// 删除sequence首尾匹配到的字符并返回
String trimFrom(CharSequence sequence)

// 删除sequence首部匹配到的字符
String trimLeadingFrom(CharSequence sequence);

// 删除sequence尾部匹配到的字符
String trimTrailingFrom(CharSequence sequence);

// 将经过匹配的sequence替换成replacement 
String collapseFrom(CharSequence sequence, char replacement);

// 将sequence先trim再replace
String trimAndCollapseFrom(CharSequence sequence, char replacement);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章