链接地址:http://www.xx566.com/detail/126.html
CharMatcher是guava提供的用于进行字符匹配的工具类,翻开CharMatcher的源码,我们知道CharMatcher是一个抽象 类,在其内部guava默认做了大量的实现,用来更方便的对字符串做匹配,同时CharMatcher也提供了大量处理字符串的方法,可以对匹配后的字符 串进行处理,下面我们开始CharMatcher的学习。
CharMatcher抽象类内部做了大量的实现,首先,我们来简单的说明下这些类的作用,如下:
BREAKING_WHITESPACE:用于匹配所有的可换行的空白符,如\t,\n,\f,\r等,源码如下:
public static final CharMatcher BREAKING_WHITESPACE = new CharMatcher() { @Override public boolean matches(char c) { switch (c) { case '\t': case '\n': case '\013': case '\f': case '\r': case ' ': case '\u0085': case '\u1680': case '\u2028': case '\u2029': case '\u205f': case '\u3000': return true; case '\u2007': return false; default: return c >= '\u2000' && c <= '\u200a'; } }
ASCII:用于匹配ASCII字符
DIGIT:匹配ASCII数字
JAVA_DIGIT:匹配unicode数字
JAVA_LETTER:匹配字母(含中文)
JAVA_LETTER_OR_DIGIT:匹配字母(含中文)或数字
JAVA_UPPER_CASE:匹配所有大写字符
JAVA_LOWER_CASE:匹配所有小写字符
JAVA_ISO_CONTROL:匹配iso控制字符
INVISIBLE:匹配所有不可见字符
SINGLE_WIDTH:匹配单字宽字符
ANY:用于匹配任意字符
NONE:不匹配所有字符
WHITESPACE:用于匹配所有空白字符
CharMatcher同时也提供了许多的工厂方法,我们可以使用CharMatcher来调用这些方法获取Matcher实例,如下:
is(final char match):返回匹配指定字符的Matcher
isNot(final char match):返回不匹配指定字符的Matcher
anyOf(final CharSequence sequence):返回能够匹配sequence中任一字符的Matcher
noneOf(CharSequence sequence):返回能够过滤sequence中任一字符的Matcher
inRange(final char startInclusive, final char endInclusive):返回匹配范围内任意字符的Matcher
forPredicate(final Predicate<? super Character> predicate):返回使用Predicate的apply()判断匹配的Matcher
negate():返回与当前Matcher判断规则相反的Matcher
and(CharMatcher other):返回与other匹配条件组合进行与运算的Matcher
or(CharMatcher other):返回与other匹配条件组合进行或运算的Matcher
precomputed():返回经过预先计算的,最优于当前运行环境的Matcher
获取的符合规则的Matcher后,有以下常用方法来处理字符串并返回结果,如下:
removeFrom(CharSequence sequence):去除匹配到的字符
retainFrom(CharSequence sequence):筛选匹配到的字符
replaceFrom(CharSequence sequence, char replacement):使用指定字符替换匹配到的字符
replaceFrom(CharSequence sequence, CharSequence replacement):使用指定字符替换匹配到的字符
trimFrom(CharSequence sequence):去除首尾匹配到的字符
trimLeadingFrom(CharSequence sequence):去除首部匹配到的字符
trimTrailingFrom(CharSequence sequence):去除尾部匹配到的字符
collapseFrom(CharSequence sequence, char replacement):将匹配到的字符组(多个字符)替换成指定字符
trimAndCollapseFrom(CharSequence sequence, char replacement):去除首尾空格后进行字符替换
另外,CharMatcher还提供了一些判断方法和获取字符索引的方法,如下:
matchesAnyOf(CharSequence sequence):如果sequence中任一字符匹配,返回true
matchesAllOf(CharSequence sequence):如果sequence中所有字符都匹配,返回true
matchesNoneOf(CharSequence sequence):如果sequence中所有字符都不匹配,返回true
indexIn(CharSequence sequence):返回匹配到的第一个字符的索引
indexIn(CharSequence sequence, int start):返回从指定索引开始,匹配到的第一个字符的索引
lastIndexIn(CharSequence sequence):返回匹配到的最后一个字符的索引
countIn(CharSequence sequence):返回匹配到的字符数量
下面,我们通过一些简单的例子,来学习一下CharMatcher的使用,代码如下:
package guava; import com.google.common.base.CharMatcher; import org.junit.Test; /** * CharMatcher:字符匹配工具类 * User: Realfighter * Date: 2014/8/16 * Time: 13:06 */ public class CharMatcherTest { private static String sequence = "HELLO RealFighter ~!@#$%^&*() ,,.。 \n123(*&gS 你好\t234啊 abc \n"; //打印方法 private static void print(Object obj) { System.out.println(String.valueOf(obj)); } @Test public void testCharMatcher() { //原始字符串 print(sequence); //使用JAVA_ISO_CONTROL去除所有控制字符\n\t String str = CharMatcher.JAVA_ISO_CONTROL.removeFrom(sequence); print(str); //筛选出所有的字母(包含中文)或数字 str = CharMatcher.JAVA_LETTER_OR_DIGIT.retainFrom(sequence); print(str); //匹配sequence中的数字并全部替换成*号 str = CharMatcher.JAVA_DIGIT.replaceFrom(sequence,"*"); print(str); //去除首尾连续匹配到的大写字符 str = CharMatcher.JAVA_UPPER_CASE.trimFrom(sequence); print(str); //去除首部连续匹配到的大写字符 str = CharMatcher.JAVA_UPPER_CASE.trimLeadingFrom(sequence); print(str); //去除尾部连续匹配到的大写字符 str = CharMatcher.JAVA_UPPER_CASE.trimTrailingFrom(sequence); print(str); //将匹配到的大写字符替换成问号 str = CharMatcher.JAVA_UPPER_CASE.collapseFrom(sequence,'?'); print(str); //去除首尾空白符后将匹配到的小写字符替换为问号 str = CharMatcher.JAVA_LOWER_CASE.trimAndCollapseFrom(sequence,'?'); print(str); } }
运行结果如下:
原始字符串: HELLO RealFighter ~!@#$%^&*() ,,.。 123(*&gS 你好 234啊 abc 使用JAVA_ISO_CONTROL去除所有控制字符\n\t: HELLO RealFighter ~!@#$%^&*() ,,.。 123(*&gS 你好234啊 abc 筛选出所有的字母(包含中文)或数字: HELLORealFighter123gS你好234啊abc 匹配sequence中的数字并全部替换成*号: HELLO RealFighter ~!@#$%^&*() ,,.。 ***(*&gS 你好 ***啊 abc 去除首尾连续匹配到的大写字符: RealFighter ~!@#$%^&*() ,,.。 123(*&gS 你好 234啊 abc 去除首部连续匹配到的大写字符: RealFighter ~!@#$%^&*() ,,.。 123(*&gS 你好 234啊 abc 去除尾部连续匹配到的大写字符: HELLO RealFighter ~!@#$%^&*() ,,.。 123(*&gS 你好 234啊 abc 将匹配到的大写字符替换成问号: ? ?eal?ighter ~!@#$%^&*() ,,.。 123(*&g? 你好 234啊 abc 去除首尾空白符后将匹配到的小写字符替换为问号: HELLO R?F? ~!@#$%^&*() ,,.。 123(*&?S 你好 234啊 ?
总结:CharMatcher中提供了大量的方法,有些方法也不太容易理解,在开发中也不常用到,而且没有提供正则表达式判断匹配的方法,在日常工作中,还是要与其他工具类如Apache Commons一起使用效果更佳。