Guava库学习:学习使用CharMatcher进行字符的匹配

    链接地址: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一起使用效果更佳。

你可能感兴趣的:(guava,CharMatcher,字符匹配)