参考:并发编程网 – ifeve.com本文链接地址: [Google Guava] 6-字符串处理:分割,连接,填充
package com.gkwind.strings;
import com.google.common.base.CharMatcher;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import java.util.Arrays;
import java.util.List;
/**
* Created by gkwind on 2018/2/13 0013.
*/
public class StringUtilTest {
public static void main(String[] args) {
// joinerTest();
// splitterTest();
charMatcherTest();
}
//警告:joiner实例总是不可变的。
// 用来定义joiner目标语义的配置方法总会返回一个新的joiner实例。
// 这使得joiner实例都是线程安全的,你可以将其定义为static final常量。
private static void joinerTest() {
Joiner joiner =Joiner.on(";").skipNulls();
System.out.println(joiner.join(Arrays.asList("1","a",3,null,"xxx")));//1;a;3;xxx
Joiner joiner2 =Joiner.on(',').useForNull("\t");
System.out.println(joiner2.join(Arrays.asList("1","a",3,null,"xxx")));//1,a,3, ,xxx
}
private static void splitterTest(){
String s=";a;;b; ;c; ";
List<String> strings = Splitter.on(';').splitToList(s);
System.out.println(strings);//[, a, , b, , c, ]
strings = Splitter.on(';').trimResults().splitToList(s); //只是将空格替换成了空字符串
System.out.println(strings);//[, a, , b, , c, ]
strings = Splitter.on(';').trimResults().omitEmptyStrings().splitToList(s);//最符合预期 去掉了首尾的空格和所有空字符串
System.out.println(strings);//[a, b, c]
strings = Splitter.on(';').trimResults().omitEmptyStrings().limit(2).splitToList(s);
System.out.println(strings);//[a, b; ;c;]
for (String string : strings) {
System.out.println(string);
}
}
private static void charMatcherTest(){
String s=" axjn你AXc爱_)山到 付&*^哦度飞x903#$^24sjas,";
// axjn你AXc爱_)山到 付&*^哦度飞x903#$^24sjas,
System.out.println(s);
//保留 数字
System.out.println(CharMatcher.DIGIT.retainFrom(s));//90324
//保留 ASCII
System.out.println(CharMatcher.ASCII.retainFrom(s));// axjnAXc_) &*^x903#$^24sjas,
////用*号 替换 所有数字
System.out.println(CharMatcher.JAVA_DIGIT.replaceFrom(s, "*"));// axjn你AXc爱_)山到 付&*^哦度飞x***#$^**sjas,
System.out.println(s.replaceAll("\\d","*"));//同上
//用*号 替换 所有数字和大写字符
System.out.println(CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_UPPER_CASE).replaceFrom(s, "*"));// axjn你**c爱_)山到 付&*^哦度飞x***#$^**sjas,
System.out.println(s.replaceAll("[\\dA-Z]","*"));//同上
//保留 abc任意字符串
System.out.println(CharMatcher.anyOf("abc").retainFrom(s));//aca
System.out.println(CharMatcher.is('c').retainFrom(s));//c
//保留 数字和c-z的字符
System.out.println(CharMatcher.JAVA_DIGIT.or(CharMatcher.inRange('c','z')).retainFrom(s));//xjncx90324sjs
//移除 数字和c-z的字符
System.out.println(CharMatcher.JAVA_DIGIT.or(CharMatcher.inRange('c','z')).removeFrom(s));// a你AX爱_)山到 付&*^哦度飞#$^a,
}
}
拆分器工厂
方法 | 描述 | 范例 |
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) | 限制拆分出的字符串数量 |
字符匹配器
CharMatcher中的常量可以满足大多数字符匹配需求:
ANY | NONE | WHITESPACE | 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) | 枚举匹配字符。如CharMatcher.anyOf(“aeiou”)匹配小写英语元音 |
is(char) | 给定单一字符匹配。 |
inRange(char, char) | 给定字符范围匹配,如CharMatcher.inRange(‘a’, ‘z’) |
此外,CharMatcher还有negate()、and(CharMatcher)和or(CharMatcher)方法。
使用字符匹配器
CharMatcher提供了多种多样的方法操作CharSequence中的特定字符。其中最常用的罗列如下:
方法 | 描述 |
collapseFrom(CharSequence, char) | 把每组连续的匹配字符替换为特定字符。如WHITESPACE.collapseFrom(string, ‘ ‘)把字符串中的连续空白字符替换为单个空格。 |
matchesAllOf(CharSequence) | 测试是否字符序列中的所有字符都匹配。 |
removeFrom(CharSequence) | 从字符序列中移除所有匹配字符。 |
retainFrom(CharSequence) | 在字符序列中保留匹配字符,移除其他字符。 |
trimFrom(CharSequence) | 移除字符序列的前导匹配字符和尾部匹配字符。 |
replaceFrom(CharSequence, CharSequence) | 用特定字符序列替代匹配字符。 |