目录
【字符串处理】
一、Joiner 连接器
Joiner用于将字符串序列通过指定的分隔符连接起来,另外通过一些属性的设置可以让字符串的连接变的更简单。
String join = Joiner.on(",").skipNulls().join(Lists.newArrayList(1, 2, null, 3)); // 1,2,3
Joiner.on(";").useForNull("-1").appendTo(new StringBuilder(join), Lists.newArrayList(4, 5, null)); // 1,2,34;5;-1
Joiner 通过静态方法 on() 构造实例,通过 join() 对字符串进行连接,返回 String。
方法名 | 说明 |
---|---|
Joiner.on(String) | 按给定字符串拼接 |
Joiner.on(char) | 按给定字符拼接 |
useForNull(String) | 拼接字符串时按给定字符串替换null |
skipNulls() | 拼接字符串时忽略null |
join(Iterable) | 拼接Iterable |
join(Iterator) | 拼接Iterator |
join(Object[]) | 拼接Object数组 |
join(Object, Object, Object…) | 按参数拼接 |
appendTo(A extends Appendable, …) | 在A后拼接字符串 |
appendTo(StringBuilder, …) | 在StringBuilder后拼接字符串 |
注:
1、join 方法最终是通过调用 appendTo 方法来实现的,因此 appendTo 方法中的‘…’是 join 中传来的参数类型。
2、joiner实例总是不可变的。用来定义joiner目标语义的配置方法总会返回一个新的joiner实例,这使得joiner实例都是线程安全的。
二、Splitter 拆分器
首先比较下JDK自带的字符串分割方法和Splitter:
String string = "; 1;2;;;; 24 ;";
System.out.println(Arrays.toString(string.split(";")));
System.out.println(Splitter.on(";").trimResults().omitEmptyStrings().split(string));
// JDK method: [, 1, 2, , , , 24 ]
// Guava method: [1, 2, 24]
比较下发现一个奇特的现象,split方法丢掉了最后一个分隔符,而保留了第一个,这显然不能满足特定条件下的需求。因此,再是来看下Splitter的工具:
方法名 | 说明 |
---|---|
Splitter.on(char) | 按给定字符拆分 |
Splitter.on(CharMatcher) | 按给定字符匹配器拆分(下面会提到) |
Splitter.on(String) | 按给定字符串拆分 |
Splitter.on(Pattern), Splitter.onPattern(String) | 按正则表达式拆分 |
Splitter.fixedLength(int) | 按固定长度拆分 |
omitEmptyStrings() | 去掉结果中的空字符串 |
limit(int) | 限制拆分出的字符串数量 |
trimResults | 移除结果字符串的前导空白和尾部空白 |
trimResults(CharMatcher) | 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符 |
split(CharSequence) | 拆分指定字符串 |
splitToList(CharSequence) | 将拆分的字符串转为List |
注:splitter实例总是不可变的。用来定义splitter目标语义的配置方法总会返回一个新的splitter实例,这使得splitter实例都是线程安全的。
三、CharMatcher 字符匹配
CharMatcher的提供了一系列方法,可以对字符作特定类型的操作:修剪[trim]、折叠[collapse]、移除[remove]、保留[retain]等等。
CharMatcher实例首先代表概念
1:怎么才算匹配字符?然后它还提供了很多操作概念
2:如何处理这些匹配字符?
这样的设计使得API复杂度的线性增加可以带来灵活性和功能两方面的增长。
CharMatcher中的常量可以满足大多数字符匹配需求:
- | - | - | - |
---|---|---|---|
ANY | NONE | WHITESPAC | BREAKING_WHITESPACE |
INVISIBLE | DIGIT | JAVA_LETTER | JAVA_DIGIT |
JAVA_LETTER_OR_DIGIT | JAVA_ISO_CONTROL | JAVA_LOWER_CASE | JAVA_UPPER_CASE |
ASCII | SINGLE_WIDTH |
其他获取字符匹配器的常见方法:
方法 | 说明 |
---|---|
anyOf(CharSequence) | 枚举匹配字符 |
is(char) | 给定单一字符匹配 |
inRange(char, char) | 给定字符范围匹配 |
negate() | 不按给定字符匹配 |
and(CharMatcher) | 满足当前匹配和给定匹配的条件 |
or(CharMatcher) | 满足当前匹配或给定匹配的条件 |
使用字符匹配器方法:
方法 | 说明 |
---|---|
collapseFrom(CharSequence, char) | 把每组连续的匹配字符替换为特定字符 |
matchesAllOf(CharSequence) | 测试是否字符序列中的所有字符都匹配 |
removeFrom(CharSequence) | 从字符序列中移除所有匹配字符 |
retainFrom(CharSequence) | 在字符序列中保留匹配字符,移除其他字符 |
trimFrom(CharSequence) | 移除字符序列的前导匹配字符和尾部匹配字符 |
replaceFrom(CharSequence, CharSequence) | 用特定字符序列替代匹配字符 |
String sequence = "1. the banana is bend";
CharMatcher.anyOf("abcd").retainFrom(sequence); // baaabd
CharMatcher.is('a').retainFrom(sequence); // aaa
CharMatcher.inRange('b', 'e').retainFrom(sequence); // ebbed
CharMatcher.inRange('b', 'e').negate().retainFrom(sequence); // 1. th anana is n
CharMatcher.is('a').and(CharMatcher.inRange('a', 'b')).retainFrom(sequence); // aaa
CharMatcher.is('a').or(CharMatcher.is('b')).retainFrom(sequence); // baaab
CharMatcher.WHITESPACE.collapseFrom(sequence, ' '); // 1. the banana is bend
CharMatcher.JAVA_LETTER.matchesAllOf(sequence); // false
CharMatcher.ANY.removeFrom(sequence); // ""
CharMatcher.DIGIT.trimFrom(sequence); // . the banana is bend
CharMatcher.BREAKING_WHITESPACE.replaceFrom(sequence, ""); // 1.thebananaisbend
四、Charsets 字符集
Charsets针对所有Java平台都要保证支持的六种字符集提供了常量引用。尝试使用这些常量,而不是通过名称获取字符集实例。
string.getBytes(Charsets.UTF_8);
五、CaseFormat 大小写格式
CaseFormat被用来方便地在各种ASCII大小写规范间转换字符串——比如,编程语言的命名规范。CaseFormat支持的格式如下:
格式 | 范例 |
---|---|
LOWER_CAMEL | lowerCamel |
LOWER_HYPHEN | lower-hyphen |
LOWER_UNDERSCORE | lower_underscore |
UPPER_CAMEL | UpperCamel |
UPPER_UNDERSCORE | UPPER_UNDERSCORE |
CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, "utf-8") // UTF-8