有时候我们在项目中需要拼接一组字符串,中间用分隔符连接。
但使用jdk,你不得对最后一个元素和前面的其他元素进行区分。
使用guava提供的工具类让这一切变得简单。
一、拼接字符串
Joiner joiner = Joiner.on("; ").skipNulls(); return joiner.join("Harry", null, "Ron", "Hermione"); //Harry; Ron; Hermione Joiner.on(",").join(Arrays.asList(1, 5, 7)); // returns "1,5,7"
二、拆分字符串
拆分字符串是拼接字符串的逆向操作。jdk内置了对拆分字符串的操作方法String.split().
但当你面对的是不规则的内容时,这个工作并不简单。比如
",a,,b,".split(",")返回什么?
"", "a", "", "b", ""
null, "a", null, "b", null
"a", null, "b"
"a", "b"
- 以上都不是
正确答案是5,实际返回: "", "a", "", "b"
但是这真是我们想要的结果吗?
guava包Splitter允许你对拆分行为进行完全的控制以规避令人迷惑的结果。
Splitter.on(',') .trimResults() .omitEmptyStrings() .split("foo,bar,, qux"); //[foo, bar, qux]
更多选择
Base Factories
Method | Description | Example |
---|---|---|
Splitter.on(char) |
按照一个字符拆分 | Splitter.on(';') |
Splitter.on(CharMatcher) |
按照一组字符规则拆分 | Splitter.on(CharMatcher.BREAKING_WHITESPACE) Splitter.on(CharMatcher.anyOf(";,.")) |
Splitter.on(String) |
按照一个字符串拆分 | Splitter.on(", ") |
Splitter.on(Pattern) Splitter.onPattern(String) |
按照正则表达式拆分 | Splitter.onPattern("\r?\n") |
Splitter.fixedLength(int) |
按照字符长度拆分 | Splitter.fixedLength(3) |
Modifiers
Method | Description | Example |
---|---|---|
omitEmptyStrings() |
自动忽略空字符串 | Splitter.on(',').omitEmptyStrings().split("a,,c,d") returns "a", "c", "d" |
trimResults() |
自动清除空白符 | Splitter.on(',').trimResults().split("a, b, c, d") returns "a", "b", "c", "d" |
trimResults(CharMatcher) |
清除指定字符 | Splitter.on(',').trimResults(CharMatcher.is('_')).split("_a ,_b_ ,c__") returns "a ", "b_ ", "c" . |
limit(int) |
指定拆分字符串个数 | Splitter.on(',').limit(3).split("a,b,c,d") returns "a", "b", "c,d" |
如果你希望得到一个List
, 用 splitToList()
替代split()
.
如果你想把字符串拆分成Map,也能实现
Map<String, String> split2 = Splitter.on(",") .withKeyValueSeparator(":") .split("A:1,C:2,E:3"); System.out.println(split2); //{A=1, C=2, E=3}
三、CharMatcher
CharMatcher提供一种对特殊字符更细粒度的控制。
String string = "WANG\tbin\n123!@#\r"; String noControl = CharMatcher.javaIsoControl().removeFrom(string);//WANGbin123!@# String theDigits = CharMatcher.digit().retainFrom(string); //123 String spaced = CharMatcher.whitespace().trimAndCollapseFrom(string, ' ');//WANG bin 123!@# String noDigits = CharMatcher.javaDigit().replaceFrom(string, "*"); //WANG bin\n***!@# String lowerAndDigit = CharMatcher.javaDigit().or(CharMatcher.javaLowerCase()).retainFrom(string);//bin123