使用Google Guava来编写优雅的代码一字符串处理2

字符串处理在日常开发过程经常容易碰到,运用的场景也非常广泛,前面一篇文章简要介绍了Google Guava中关于字符串分割与合并的两个主要的类Joiner和Splitter的主要API和基本使用。

本章节则主要关于与字符串处理相关的其它类,诸如CharMatcher、CaseFormat、Charsets以及Strings等。

在日常的字符串操作中,我们可以视为两个部分:匹配和处理。

  • 匹配的过程就是找到符合要求的字符。前文介绍的Joiner和Splitter的on方法就是一个匹配的过程。另外还有如在WEB开发中经常涉及到的全数字校验、全英文字符校验、字符的位置等等。
  • 处理的过程则意味这如何对这些如何条件的数据进行处理。处理的需求也是多种多样的,常见的如替换、过滤、补全、清空等。

Google Guava的良好的API设计能帮助我们更容易的解决字符串处理中所需要实现的基本功能,从而能有更多的关注集中在业务处理层面。

CharMatcher

CharMatcher类提供了针对字符处理的多种方法。正如前文提到的字符处理过程分为两个部分:匹配和处理。

CharMatcher提供两个方面的API,分别用于匹配条件和处理数据。

匹配条件

首先CharMatcher预先定义了字符常量来帮助进行匹配字符:ANY、ASCII、BREAKING_WHITESPACE、DIGIT、INVISIBLE、JAVA_DIGIT、JAVA_ISO_CONTROL、JAVA_LETTER、JAVA_LETTER_OR_DIGIT、JAVA_LOWER_CASE、JAVA_UPPER_CASE、NONE、SINGLE_WIDTH、WHITESPACE等。这些常量里面包含了空格、ASCII、英文字母、数字或英文字母、大小写,基本涵盖了日常字符匹配的需要。

除了这些常量,CharMatcher还另外提供了一些方法来进行字符匹配:

  • is : 符合与给定参数相同的字符 ,例如:is('_') 判断知否有下划线
  • isNot : 符合不是给定参数的字符,例如:isNot('_') 排除掉下划线以外的字符
  • anyOf : 符合在给定参数字符内的任一字符 例如:anyOf("a83h") 找到字符’a’,’8′,’3′,’h’任一个。
  • inRange : 符合给定参数字符范围内的字符 例如:inRange('a','z') 在a-z范围内的字符

此外还提供了诸如and(CharMatcher)or(CharMatcher)以及negate 等其它的方法可以组合出多种匹配条件。

处理数据

在字符处理中需要对符合或者不符合条件的数据进行相应的处理。CharMatcher提供了两类处理API,一种是返回判定结果的,比如计算出现次数、索引位置等;一种对字符串进行处理的,比如替换、清除等。

  • replaceFrom: 替换符合条件的字符。例如:CharMatcher.is('_').replaceFrom("UNIMAS_SYSTEM",'&') 返回结果:UNIMAS&SYSTEM;
  • removeFrom: 清除符合条件的字符。例如:CharMatcher.isNot('_').removeFrom("UNIMAS_SYSTEM") 返回结果为: _
  • countIn:计算出现次数 例如:CharMatcher.anyOf("a83h").countIn("UNIMAS_SYSTEM") 返回结果为: 0
  • indexIn:首次出现的索引位置 ,可以从0开始,也可以指定从其它位置开始。 CharMatcher.anyOf("a83h").indexIn("UNIMAS_SYSTEM") 返回结果为: -1 CharMatcher.anyOf("a83h").indexIn("UNIMAS3_SYSTEM") 返回结果则为6
  • lastIndexIn: 最后一次出现的索引位置 ,可以从0开始,也可以指定从其它位置开始。

其它的方法还有retainFrom、trimLeadingFrom、trimTrailingfrom、matches、matchesAllOf等。

Strings

除了前面提到的几个字符处理相关的类以外,Guava也有一个专门针对String或CharSequence进行相关处理的工具类,其内部的API方法也非常实用和简便。在这里也简单介绍下。

  • 字符串对象的null和””的相关处理方法,在日常开发中经常需要会碰到。为此Guava提供了三个常用的方法:isNullOrEmpty(判断是否为null或者空字符串)、emptyToNull(将空字符串转换null)和nullToEmpty(将null转换为空字符串)。后面的两种方法经常出现在sql处理中。
  • 补全与重复。比如为了产生固定位数的的编码,我们常常需要在不足的位数前后进行前补全或后补全。偶尔也需要让某一个字符串重复多次。这里Guava提供padEnd、padStart和repeat方法来实现这些功能,比如:”Strings.padStart(“123″,8,”0”)”-–|在123前面补0变成8位数的编码。
  • 找到两个字符串中前缀相同或后缀相同的最长子串。比如Strings.commonPrefix(“A-Stringa”,”A-StrindB”)返回则是”A-Strin”;

Charsets和CaseFormat

Charsets

预定义了常用的字符集的常量。包含ISO_8859_1、US_ASCII、UTF_16、UTF_16BE、UTF_16LE、UTF_8;

CaseFormat

主要用于拼写格式的转换,从定义风格来看更向是符合编程语言的格式间转换。

提供的方法有:

  • LOWER_CAMEL : 转换为小写开头 lowerCamel
  • LOW_HYPHEN: 小写的中划线分割 lower-hyphen
  • LOWER_UNDERSCORE : lower_underscore
  • UPPER_CAMEL: UpperCamel
  • UPPER_UNDERSCORE :UPPER_UNDERSCORE

实现转换方法示例如下:

CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL,"CONSTANT_NAME"); //returns "constantName";
CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN,"yourIdeaLove"); //returns "your-idea-lover"