Google Guava- 字符串处理

简介

Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。 所有这些工具每天都在被Google的工程师应用在产品服务中。

学习和使用 Google Guava 可以写出更加优雅的Java代码。

这边文章我们先介绍一下:

以面向对象思想处理字符串:Joiner/Splitter/CharMatcher

连接器[Joiner]

Joiner是连接器,用分隔符把字符串连接起来。Joiner 我们通常会把它们定义为 static final ,利用on生成对象后,在应用到String 进行处理,这是可以复用的。

对于 Joiner 常用的方法:

  • skipNulls: 跳过NULL元素\
  • useForNull:对于NULL元素使用其他替代
      //1.1 join 拼接集合中的元素
        System.out.println("1.1 join 拼接集合中的元素:"+Joiner.on(";").join(Ints.asList(1,2,3)));//1;2;3
         //1.2 skipNullls 过滤null
        Joiner joiner = Joiner.on(";").skipNulls();
        System.out.println("1.2 skipNullls 过滤null:"+joiner.join("hello",null,"world"));

        //1.3 如果字符串为null,可以用固定字符串来代替
        Joiner joiner2 = Joiner.on(";").useForNull("chinese");
        System.out.println("1.3 如果字符串为null,可以用固定字符串来代替:"+joiner2.join("hello",null,"world"));

        //1.4 Joiner 也可以用来连接对象
        System.out.println("1.4 Joiner 也可以用来连接对象:"+Joiner.on(",").join(Arrays.asList(1,2,3)));

        //1.5 withKeyValueSeparator 拼接map中的元素
        System.out.println(Joiner.on("#").withKeyValueSeparator("=").join(ImmutableMap.of("a",1,"b",2)));//a=1#b=2

拆分器[Splitter]

对于 拆分器 Splitter 最常用的方法 是 : trimResults()/omitEmptyStrings();

拆分的方式有字符串、正则、还是有固定长度分割

拆分器工厂

方法描述范例
Splitter.on(char)按单个字符拆分Splitter.on(‘;’)
Splitter.on(CharMatcher)按字符匹配器拆分Splitter.on(CharMatcher.BREAKING_WHITESPACE)
Splitter.on(String)按字符串拆分Splitter.on(“, “)
Splitter.on(Pattern) Splitter.onPattern(String)按正则表达式拆分Splitter.onPattern(“\r?\n”)
Splitter.fixedLength(int)按固定长度拆分;最后一段可能比给定长度短,但不会为空。Splitter.fixedLength(3)

拆分器修饰符

方法描述
omitEmptyStrings()从结果中自动忽略空字符串
trimResults()移除结果字符串的前导空白和尾部空白
trimResults(CharMatcher)给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符
limit(int)限制拆分出的字符串数量

示例如下:

// 2.1 Splitter.on(char) 按照单个字符拆分 结果:[foo, bar, qux]
        System.out.println("2.1 按照单个字符拆分:"+ Splitter.on(',').split("foo,bar,qux"));
        // 2.2 Splitter.on(CharMatcher) 按字符匹配器拆分 结果: [2, 3, 4, 5, 6]
        System.out.println("2.2 按字符匹配器拆分:"+ Splitter.on(CharMatcher.whitespace()).splitToList("2 3 4 5 6"));
        // 2.3 Splitter.on(String) 按字符串拆分 //结果:[2, 3, 4, 5]
        System.out.println("2.3 按字符串##拆分:"+ Splitter.on("##").splitToList("2##3##4##5"));
        // 2.4 Splitter.onPattern(Pattern) 按正则表达式进行拆分  //结果:[abc, 8]
        System.out.println("2.4 按正则表达式进行拆分:"+ Splitter.onPattern("(?=\\d)|\\W").split("abc8"));

        // 2.5 omitEmptyStrings() 从结果中自动忽略空白字符串  结果: [ foo,   bar ]
        System.out.println("2.5  从结果中自动忽略空白字符串:"+ Splitter.on(',').omitEmptyStrings().split(" foo,,,  bar ,"));

        //2.6 trimResults() 移除结果字符串的前导空白和尾部空白 结果:[foo, , , bar, ]
        System.out.println("2.6  从结果中自动忽略空白字符串:"+ Splitter.on(',').trimResults().split(" foo,,,  bar ,"));

        //2.7 trimResults(CharMatcher)  给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符 结果:[, b]
        System.out.println("2.7 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符:"+Splitter.on(";").trimResults(CharMatcher.anyOf("a")).splitToList("aa;b"));

        // 2.8 limit 分割到指定个数便不再分割 结果:[aa;b;c]
        System.out.println("2.8 limit 分割到指定个数便不再分割:"+Splitter.on(",").limit(2).splitToList("aa;b;c"));

        // 2.9 转map
        Map<String,String> map = Splitter.on(";").withKeyValueSeparator("=").split("a=1;b=2");
        System.out.println("2.9 转map:"+map);

CharMatcher

CharMatcher 提供了一系列方法,让你对字符作特定类型的操作

  • 修剪 - trim
  • 折叠 - collapse
  • 移除- remove
  • 保留 - retain

等等

1、CharMatcher本身提供了很多CharMatcher实现类,如下:

  • ANY: 匹配任何字符
  • ASCII: 匹配是否是ASCII字符
  • BREAKING_WHITESPACE: 匹配所有可换行的空白字符(不包括非换行空白字符,例如"\u00a0")
  • DIGIT: 匹配ASCII数字
  • INVISIBLE: 匹配所有看不见的字符
  • JAVA_DIGIT: 匹配UNICODE数字, 使用 Character.isDigit() 实现
  • JAVA_ISO_CONTROL: 匹配ISO控制字符, 使用 Charater.isISOControl() 实现
  • JAVA_LETTER: 匹配字母, 使用 Charater.isLetter() 实现
  • JAVA_LETTER_OR_DIGET: 匹配数字或字母
  • JAVA_LOWER_CASE: 匹配小写
  • JAVA_UPPER_CASE: 匹配大写
  • NONE: 不匹配所有字符
  • SINGLE_WIDTH: 匹配单字宽字符, 如中文字就是双字宽
  • WHITESPACE: 匹配所有空白字符

2、常用操作方法

  • 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

  • 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中匹配到的字符计数

  • 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

使用范例如下:

 //3.1 CharMatcher.DIGIT 获取字符串中的数字        retainFrom:在字符序列中保留匹配字符,移除其他字符。
        String s = "3333fff33342ff";
        //String result1 = CharMatcher.digit().retainFrom(s);
        String result1 = CharMatcher.javaDigit().replaceFrom(s,"*");
        System.out.println("3.1.获取字符串中的数字:"+result1);

        //3.2 把多个空格替换为_,去掉首尾空格    trimAndCollapseFrom:先trim在replace
        String s2 = " dfd rer3 33 ";
        String result2 = CharMatcher.whitespace().trimAndCollapseFrom(s2,'_');
        System.out.println("3.2.把多个空格替换,并去掉首位的空格"+result2);

        //3.3 获取所有的数字和小写字母
        String s3 = "eee3333___dddee==33";
        System.out.println("3.3 获取所有的数字和小写字母:"+CharMatcher.javaDigit().or(CharMatcher.javaLowerCase()).retainFrom(s3));

        //3.4 获取所有的大写字母
        String s4 = "DDDigithehhe";
        System.out.println("3.4 获取所有的大写字母:"+CharMatcher.javaUpperCase().retainFrom(s4));

        //3.5 把所有的数字用"*"代替
        String s5 = "abcd1234dfgg";
        System.out.println("3.5 把所有的数字用*代替:"+CharMatcher.javaDigit().replaceFrom(s5,"*"));

        // 3.6 获取所有单字节长度的符号
        String s6 = "chinese中国";
        System.out.println("3.6 获取所有单字节长度的符号:"+CharMatcher.singleWidth().retainFrom(s6));

        //3.7 获取字母
        String s7 ="asdfgh123344444";
        System.out.println("3.7 获取所有单字节长度的符号:"+CharMatcher.javaLetter().retainFrom(s7));

        // 3.8 获取字母或者数字
        String s8 ="asdfgh123344444-====";
        System.out.println("3.8 获取所有单字节长度的符号:"+CharMatcher.javaLetterOrDigit().retainFrom(s8));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半夏_2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值