CharMatcher源码解析
CharMatcher类介绍
CharMatcher提过了多种对字符串处理的方法,它主要用于对字符的操作以及找到匹配的字符。
CharMatcher 的内部实现主要包括两部分: 1. 实现了大量公用内部类, 用来方便用户对字符串做匹配: 例如 JAVA_DIGIT 匹配数字, JAVA_LETTER 匹配字母等等。 2. 实现了大量处理字符串的方法, 使用特定的CharMatcher可以对匹配到的字符串做出多种处理, 例如 remove(), replace(), trim(), retain()等等。
CharMatcher本身是一个抽象类, 其中一些操作方法是抽象方法, 他主要依靠内部继承CharMatcher的内部子类来实现抽象方法和重写一些操作方法, 因为不同的匹配规则的这些操作方法具有不同的实现要求。
类图
主要属性
1 | private static final int DISTINCT_CHARS = Character.MAX_VALUE - Character.MIN_VALUE + 1; |
主要方法
any()
1 | public static CharMatcher any() { |
匹配任意字符。
返回的是一个CharMatcher的实现类之一,Any的实例。
Any实现类
主要属性
1 | static final Any INSTANCE = new Any(); |
声明一个Any实例。
主要方法
any()
1 | private Any() { |
私有方法,禁止创建Any的实例。
matches
1 |
|
因为Any的本意是匹配任意字符,所以这个方法永远返回true。
indexIn
1 |
|
返回字符在需要匹配的字符串的位置。
如果需要匹配的字符串长度为0,返回-1。否则,直接返回该字符串的首字母。
indexIn(CharSequence, int)
1 |
|
返回从位置start开始,匹配的字符在字串CharSequence中的位置。如果start和字串的长度一致,返回-1,否则直接返回start。
lastIndexIn(CharSequence)
1 |
|
从给定的字串尾部开始寻找,返回第一个匹配的字符的位置。
当前直接返回最后一个字符。
matchesAllOf(CharSequence)
1 |
|
返回当前字串是否全部匹配。
此处直接返回true。
matchesNoneOf(CharSequence)
1 | @Override |
返回当前字串是否全部匹配。
如果给定的字串长度为0,返回true,否则返回false。
removeFrom(CharSequence)
1 |
|
从给定的当前字符串中移除所有匹配的字符。
当前返回空字符串。
replaceFrom(CharSequence)
1 |
|
将给定的字符串中匹配的字符替换成指定的字符。
当前直接返回一个全是replacement的字符串。
replaceFrom(CharSequence, CharSequence)
1 |
|
将给定的字符串中匹配的字符替换成指定的字符串。
当前直接返回一个全是replacement的字符串。
collapseFrom(CharSequence, char replacement)
1 |
|
将匹配的字符串替换为指定的字符。
如果给定的字符串长度为0,返回空字符串,否则返回单个replacement的字符串。
trimFrom(CharSequence)
1 |
|
从当前给定的字符串中删除匹配的字符串。
当前返回空字符串。
countIn(CharSequence)
1 |
|
统计在给定字符串中,匹配上的字符的个数。
and(CharMatcher)
1 |
|
生成一个新的CharMatcher。结果集是当前Any和other的集合(即,逻辑上的 and)。
当前直接返回other这个CharMatcher。
or(CharMatcher)
1 |
|
生成一个新的CharMatcher。结果集是当前Any或other的集合(即,逻辑上的 or)。
当前直接返回this这个CharMatcher。
negate()
1 |
|
any的相反即为none。
None()
1 | /** |
返回一个CharMatcher实例,该实例不匹配任意字符。
None实现类
主要属性
1 | static final None INSTANCE = new None(); |
INSTANCE,当前类的静态实例
主要方法
None()
1 | private None() { |
私有构造函数,禁止创建None的实例。
matches(char)
1 |
|
返回给定的字符是否匹配。
当前返回false。没有字符能匹配。
indexIn(CharSequence)
1 |
|
返回给定的字符串中符合条件的字符的位置。
当前返回-1.没有字符串能匹配。
indexIn(CharSequence, int)
1 | public int indexIn(CharSequence sequence, int start) { |
从给定的位置开始,返回给定字符串中符合条件的字符的位置。
当前返回-1.没有字符串能匹配。
lastIndexIn(CharSequence)
1 |
|
从末尾的位置开始,返回给定字符或窜符合条件的字符的位置。
当前返回-1,没有字符串能匹配。
matchesAllOf(CharSequence)
1 |
|
给定的字符串中的每个字符,是否符合要求。
如果给定的字符串长度为0,返回true,否则返回false。
matchesNoneOf(CharSequence)
1 |
|
给定的字符串中的每个字符,是否都不符合要求。
当前返回true。
removeFrom(CharSequence)
1 |
|
返回当前字符串中剔除符合条件的字符,剩下的字符串。
返回原字符串。
replaceFrom(CharSequence, char)
1 |
|
将当前字符串中符合条件的字符,替换为给定的字符。
当前返回原字符串。
replaceFrom(CharSequence, CharSequence)
1 |
|
将当前字符串中符合条件的字符,替换为给定的字符串。
当前返回原字符串。
collapseFrom(CharSequence, char)
1 |
|
将当前符合条件的字符串,缩减成给定的字符replacement。
当前返回原字符串。
trimFrom(CharSequence)
1 |
|
从给定的字符串中删除符合条件的字符,并返回剩下的字符串,
当前返回原字符串。
trimLeadingFrom(CharSequence)
1 |
|
从给定的字符串首部中删除匹配的字符,只删除一次。
当前返回原字符串。
trimTrailingFrom(CharSequence)
1 |
|
从给定的字符串尾部中删除匹配的字符,只删除一次。
当前返回原字符串。
countIn(CharSequence)
1 |
|
统计给定的字符串中符合条件的字符数目。
当前返回0.
and(CharMatcher)
1 |
|
返回一个当前CharMatcher和other的逻辑上’and’的CharMatcher。
当前返回this。
or(CharMatcher)
1 |
|
返回一个当前CharMatcher和ohter的逻辑上’or’的CharMatcher。
当前返回other。
negate()
1 |
|
返回negate的相反。none的相反就是any。
whitespace()
1 | /** |
返回一个Whitespace的实例。Whitespace用来匹配最新的Unicode标准下的空格。
Whitespace实现类
主要属性
1 | // TABLE is a precomputed hashset of whitespace characters. MULTIPLIER serves as a hash function |
TABLE是预先计算好的25个UNICODE中的字符。MULTIPLIER是一个魔数,也是预先计算好的。1682554634这个魔数和TABLE是刻意设计成这样的。但是源码中没有解释如何生成,在GitHub上倒是也有人这么问过,Guava owner回复说道:他们确实有一个生成器,但是由于一些依赖的原因,并没有开源出来。
TABLE的长度为32,而Integer.numberOfLeadingZeros(32 - 1)的结果为27。因为,31的二进制为11111
。而Java中一个Integer占32位,所以SHIFT为27.
主要方法
Whitespace()
1 | Whitespace() { |
构造函数,调用父类的构造函数。
matches(char)
1 |
|
算法比较简单,即判断TABLE字符串中是否存在同样的字符C。上述算法通过将字符c和魔数的乘积(超出int范围之后取低32位)向右移动27位得到的数值,即为TABLE的下标索引,例如字符’u2002’其值为8194,它和1682554634的乘积再右移27位得到0,而TABLE第0个字符就是’u2002’,则判定相等,字符’u3000’的值为12288,应用相同算法得到26,TABLE第26个字符也是’u3000’,同样判定相等。
setBits(BitSet table)
1 | // used only from other GwtIncompatible code |
将匹配的字符,设置到对应的BitSet中。
breakingWhitespace()
1 | /** |
返回一个BreakingWhitespace的实例。该实例确认字符是否为Breaking Whitespace(翻译不了)。
BreakingWhitespace实现类
主要属性
1 | static final CharMatcher INSTANCE = new BreakingWhitespace(); |
BreankingWhitespace的实例
主要方法
matches(char)
1 |
|
switch case 判断是否符合特定的条件
toString()
1 |
|
返回给定的字符串CharMatcher.breakingWhitespace()
。
ascii()
1 | /** |
返回一个Ascii的实例。该实例判断字符是否为Ascii字符。
Ascii实现类
主要属性
1 | static final Ascii INSTANCE = new Ascii(); |
Ascii的实例
主要方法
Ascii()
1 | Ascii() { |
构造函数,直接调用父类的构造函数。
matches(char)
1 |
|
直接判断当前字符是否小于等于127.
digit()
1 | /** |
返回一个Digit实例。该实例根据Unicode确认字符是否为BMP数字。
Digit实现类
主要属性
1 | // Must be in ascending order. |
ZEROS为0在UNICODE中的各种表现。
主要方法
zeros()
1 | private static char[] zeroes() { |
返回0的数组
nines()
1 | private static char[] nines() { |
返回9的数组。
DIgit()
1 | private Digit() { |
调用父类的构造方法,传入上届和下届
javaDigit()
1 | /** |
返回JavaDigit的实例。该实例实现了JavaDigit
JavaDigit实现类
主要属性
1 | static final JavaDigit INSTANCE = new JavaDigit(); |
主要方法
matches(char)
1 |
|
直接调用了Character.isDigit方法
toString()
1 |
|
javaLetter()
1 | /** |
返回JavaLetter的实例。该实例根据Java的定义,判断一个BMP 字母是不是一个Java 字母。
JavaLetter实现类
主要属性
1 | static final JavaLetter INSTANCE = new JavaLetter(); |
主要方法
matches(char)
1 |
|
直接调用Java的isLetter方法判断
toString()
1 |
|
javaLetterOrDigit()
1 | /** |
返回一个JavaLetterOrDigit实例。该实例判断一个字符是否为Java的数字或者字母。
JavaLetterOrDigit实现类
主要属性
1 | static final JavaLetterOrDigit INSTANCE = new JavaLetterOrDigit(); |
主要方法
matches(char)
1 |
|
直接调用Java的isLetterOrDigit方法
toString()
1 |
|
javaUpperCase()
1 | /** |
返回一个JavaUpperCase实例。该实例判断给定的字符是否是Java中的大写字母。
JavaUpperCase实现类
主要属性
1 | static final JavaUpperCase INSTANCE = new JavaUpperCase(); |
主要方法
matches(char)
1 |
|
调用Java的isUpperCase方法,判断。
toString()
1 |
|
javaLowerCase()
1 | /** |
返回一个JavaLowerCase实例。该实例判断给定的字符是否是Java中的小谢字符。
JavaLowerCase实现类
主要属性
1 | static final JavaLowerCase INSTANCE = new JavaLowerCase(); |
主要方法
matches(char)
1 |
|
toString()
1 |
|
javaIsoControl()
1 | /** |
返回一个JavaIsoControl的实例。该实例判断给定的字符是否是Java中的控制字符。
JavaIsoControl实现类
主要属性
1 | static final JavaIsoControl INSTANCE = new JavaIsoControl(); |
主要方法
matches
1 |
|
根据范围判断
JavaIsoControl
1 | private JavaIsoControl() { |
invisible()
1 | /** |
返回一个Invisible的实例。该实例确认给定的字符是否是不可见字符。
Invisible实现类
主要属性
1 | // Plug the following UnicodeSet pattern into |
主要方法
Invisible()
1 | private Invisible() { |
调用父类RnagesMatcher方法,传入上界和下界。
singleWidth()
1 | /** |
确定字符是否为全角(不是全角)。 如有疑问,该匹配器在返回false时出错(也就是说,它倾向于假定一个字符是双倍宽度)。
SingleWidth实现类
主要属性
1 | static final SingleWidth INSTANCE = new SingleWidth(); |
主要方法
SingleWidth()
1 | private SingleWidth() { |
传入上下界
is(final char)
1 | /** Returns a {@code char} matcher that matches only one specified BMP character. */ |
返回一个Is实例。该实例判断某个字符是否符合当前实例。
Is实现类
主要属性
1 | private final char match; |
需要匹配的字符
主要方法
Is(char)
1 | Is(char match) { |
构造函数,赋值当前的字符
matches(char)
1 |
|
给定的字符是否匹配is指定的字符
replaceFrom(CharSequence, char)
1 |
|
将给定的字符串中match字符,替换为replacement
and(CharMatcher)
1 |
|
如果other CharMatcher匹配上了match,返回当前charMatcher,否则返回none,即一个也没匹配上。
or(CharMatcher)
1 |
|
如果other CharMatcher匹配上了match,返回other(短路),否则返回super.or。
negate()
1 |
|
取反,返回isNot(match)
setBits(Bitset)
1 | // used only from other GwtIncompatible code |
将对应位置上的位设置为1
toString()
1 |
|
isNot(final char)
1 | /** |
返回一个CharMatcher。这个CharMatcher匹配除了当前给定字符的所有字符。
IsNot实现类
主要属性
1 | private final char match; |
需要和指定字符匹配的字符。Is的作用就是判断给定的字符是不是match。
主要方法
IsNot(char)
1 | IsNot(char match) { |
构造函数
matches(char)
1 |
|
判断给定的字符是不是和is持有的字符一致。
and(Charmatcher)
1 |
|
如果other 匹配了match,再调用isNot的父类的and方法,否则,返回other
or(CharMatcher)
1 |
|
如果other匹配了当前字符,返回any,否则,返回当前。
negate()
1 | @Override |
返回is(match)
setBits(BitSet table)
1 | // used only from other GwtIncompatible code |
toString()
1 |
|
anyOf(final CharSequence)
1 | /** |
返回一个CharMatcher,其实现判断一个给定的字符串,是否匹配任意一个sequence中的字符。
如果sequence的长度为0,返回none。
为1,返回当前字符是不是就是sequence的第一个字符
为2,返回当前字符是不是就是sequence的第一个或者第二个字符
否则,创建一个新AnyOf对象
Anyof实现类
主要属性
1 | private final char[] chars; |
保存需要匹配的字符
主要方法
Anyof(CharSequence)
1 | public AnyOf(CharSequence chars) { |
构造函数,通过给定的字符串,转为字符数组并排序。
排序的原因是在后面使用matches方法的时候,可以使用二分查找。
matches(char)
1 |
|
二分查找匹配的字符。
setBits(BitSet)
1 |
|
toString()
1 | @Override |
noneOf(CharSequence)
1 | /** |
返回anyOf的相反
inRange(final char, final char)
1 | /** |
生成指定上下界的InRange对象
InRange实现类
主要属性
1 | private final char startInclusive; |
上下界,闭区间
主要方法
InRange(char, char)
1 | InRange(char startInclusive, char endInclusive) { |
构造函数,下界一定要小于等于上界
matches(char)
1 | @Override |
判断当前字符是否在给定的上下界内
setBits(BitSet)
1 | @GwtIncompatible // used only from other GwtIncompatible code |
toString()
1 | @Override |
forPredicate(Predicate)
1 | /** |
返回一个断言
forPredicate实现类
主要属性
1 | private final Predicate<? super Character> predicate; |
断言
主要方法
ForPredicate
1 | ForPredicate(Predicate<? super Character> predicate) { |
构造方法
matches(char)
1 | @Override |
返回当前字符调用断言apply方法的结果。
apply(Character)
1 | @SuppressWarnings("deprecation") // intentional; deprecation is for callers primarily |
返回当前字符调用断言apply方法的结果。
toString()
1 | @Override |
CharMatcher()
1 | /** |
构造方法。
matches(char)
1 | /** Determines a true or false value for the given character. */ |
返回当前CharMatcher实例是否匹配字符c
negate()
1 | /** Returns a matcher that matches any character not matched by this matcher. */ |
返回一个CharMatcher,匹配所有当前matcher不能匹配的matcher
and(CharMatcher)
1 | /** |
返回一个CharMatcher,该Matcher可以匹配两个matcher都能匹配的字符。逻辑上的与
or(CharMatcher)
1 | /** |
返回一个CharMatcher,该Matcher可以匹配两个matcher能匹配的字符的合集。逻辑上的或。
precomputed()
1 | /** |
返回一个CharMatcher,该CharMather和this一致,但是可能会在速度上比较有优势。
precomputedInternal()
1 | /** |
precomputedPositive
1 | /** |
isSmall(int, int)
1 | // SmallCharMatcher |
setBits(BitSet)
1 | /** Sets bits in {@code table} matched by this matcher. */ |
matchesAnyOf(Charsequence)
1 | /** |
当前CharMatcher是否匹配给定字符串中的任意字符。
matchesAllOf(CharSequence)
1 | /** |
当前CharMatcher是否匹配给定字符串中的所有字符。
matchesNoneOf(CharSequence)
1 | /** |
当前CharMatcher是否都不匹配给定字符串中的所有字符。
indexIn(CharSequence)
1 | /** |
找到指定字符串中第一个符合CharMatcher的字符的索引
indexIn(CharSequence, CharSequence)
1 | /** |
找到指定字符串中第一个符合CharMatcher的字符串的索引
lastIndexIn(CharSequence)
1 | /** |
找到指定字符串中第一个符合CharMatcher的字符的索引(从字符串的末尾还是寻找)
countIn(CharSequence)
1 | /** |
统计符合条件的字符的总数
removeFrom(CharSequence)
1 | /** |
从给定的字符串中删除匹配的字符
retainFrom(CharSequence)
1 | /** |
从给定的字符串中删除除匹配的字符之外的字符
replaceFrom(CharSequence, Char)
1 | /** |
将符合条件的字符替换为指定的字符
replaceFrom(CharSequence, CharSequence)
1 | /** |
将符合条件的字符替换为指定的字符串
trimFrom(CharSequence)
1 | /** |
删除字符串中匹配的字符
trimLeadingFrom(CharSequence)
1 | /** |
删除给定字符串中匹配的字符,从头部开始删除。遇到不符合条件的字符就停止
trimTrailingFrom(CharSequence)
1 | /** |
删除给定字符串中匹配的字符,从尾部开始删除。遇到不符合条件的字符就停止
collapseFrom(CharSequence, char)
1 | /** |
删除匹配条件的连续字符
trimAndCollapseFrom(CharSequence, char)
1 | /** |
apply(Character)
1 | /** |
为了满足Predicate方法,实现的apply,内部走的是matches的逻辑
toString()
1 | /** |
showCharacter(char)
1 | /** |