Guava源码阅读-base-CharMatcher

package com.google.common.base;

(部分内容摘自:http://blog.csdn.net/idealemail/article/details/53860439)

之前在进行模式匹配时,比如匹配字符串中的数字,都会使用正则表达式或是ASCII码范围比对。

Pattern pattern = Pattern.compile("\d");
        Matcher matcher = pattern.matcher(a);
        while(matcher.find()){
            System.out.println(matcher.group());
        }


Pattern pattern = Pattern.compile("[0-9]");
        Matcher matcher = pattern.matcher(a);
        while(matcher.find()){
            System.out.println(matcher.group());
        }
if(str.charAt(i)>=48 && str.charAt(i)<=57){ //0-9数字的ASCII码的范围是48-57
      //这个字符是数字
}    

 这种方法显的特别冗余,现在我们看一下guava的CharMatcher怎么去匹配的。

CharMatcher.digit().retainFrom(str)

 上面这段代码的意思就是从str中找到数字。


 

简洁吧,下面开始进入源码阅读阶段。

 

1、any()方法

public static CharMatcher any() {
    return Any.INSTANCE;
  }

 这个意思是匹配所有字符。

String str="love23next234csdn3423javaeye";
System.out.println(CharMatcher.any().retainFrom(str));

输出结果:
love23next234csdn3423javaeye

 2、none()

public static CharMatcher none() {
    return None.INSTANCE;
  }

 这个方法是不匹配任何字符串

String str="love23next234csdn3423javaeye";
System.out.println(CharMatcher.none().retainFrom(str));

输出结果:

3、whitespace()

public static CharMatcher whitespace() {
    return Whitespace.INSTANCE;
  }

 匹配空白符。

下面统一将各个方法介绍如下:

 

breakingWhitespace():匹配换行

ascii():匹配ASCII码

digit():匹配数字

javaDigit():匹配java定义的digit

javaLetter():匹配java定义的字母

javaLetterOrDigit():匹配java定义的字母或数字

javaUpperCase():匹配java定义的大写字母

javaLowerCase():匹配java定义的小写字母

javaIsoControl():匹配 匹配ISO控制字符

invisible():匹配所有看不见的字符

singleWidth():匹配单字宽字符, 如中文字就是双字宽

 另外像这些方法比如WHITESPACE,已经被弃用了,可以被上面的额方法代替。


 

下面介绍一些使用方法:

CharMatcher is(char match): 返回匹配指定字符的Matcher
CharMatcher isNot(char match): 返回不匹配指定字符的Matcher
CharMatcher anyOf(CharSequence sequence): 返回匹配sequence中任意字符的Matcher
CharMatcher noneOf(CharSequence sequence): 返回不匹配sequence中任何一个字符的Matcher
CharMatcher inRange(char startInclusive, char endIncludesive): 返回匹配范围内任意字符的Matcher
CharMatcher forPredicate(Predicate<? super Charater> predicate): 返回使用predicate的apply()判断匹配的Matcher
CharMatcher negate(): 返回以当前Matcher判断规则相反的Matcher
CharMatcher and(CharMatcher other): 返回与other匹配条件组合做与来判断的Matcher
CharMatcher or(CharMatcher other): 返回与other匹配条件组合做或来判断的Matcher

 

比如上面的inRange()方法,就可以这样使用:
String str="love23next234csdn34数学2 3jav aey
e";
CharMatcher.inRange('a','z').retainFrom(str)

输出结果:
lovenextcsdnjavaeye

 


下面再介绍一些文本匹配方法

boolean matchesAnyOf(CharSequence sequence): 只要sequence中有任意字符能匹配Matcher,返回true
boolean matchesAllOf(CharSequence sequence): sequence中所有字符都能匹配Matcher,返回true
boolean matchesNoneOf(CharSequence sequence): sequence中所有字符都不能匹配Matcher,返回true int indexIn(CharSequence sequence): 返回sequence中匹配到的第一个字符的坐标
int indexIn(CharSequence sequence, int start): 返回从start开始,在sequence中匹配到的第一个字符的坐标
int lastIndexIn(CharSequence sequence): 返回sequence中最后一次匹配到的字符的坐标
int countIn(CharSequence sequence): 返回sequence中匹配到的字符计数

 

比如:

CharMatcher.digit().countIn(str)

 就会输出字符串中所有数字的个数。


 

 

字符串使用方法,介绍如下:


String removeFrom(CharSequence sequence): 删除sequence中匹配到到的字符并返回
String retainFrom(CharSequence sequence): 保留sequence中匹配到的字符并返回
String replaceFrom(CharSequence sequence, char replacement): 替换sequence中匹配到的字符并返回
String trimFrom(CharSequence sequence): 删除首尾匹配到的字符并返回
String trimLeadingFrom(CharSequence sequence): 删除首部匹配到的字符
String trimTrailingFrom(CharSequence sequence): 删除尾部匹配到的字符
String collapseFrom(CharSequence sequence, char replacement): 将匹配到的组(连续匹配的字符)替换成replacement
String trimAndCollapseFrom(CharSequence sequence, char replacement): 先trim在replace

 

比如trimFrom()方法

 String str="123love23next234csdn34数学2  3jav    aeye456";
CharMatcher.digit().trimFrom(str);

输出结果:
love23next234csdn34数学2  3jav    aeye

把开头和结尾的数字都去掉了

 

 

 

 

原文地址:https://www.cnblogs.com/haolnu/p/7372552.html