字符串处理
字符串的处理在编写代码中算是比较常见的工作。本篇博文将主要介绍Google Guava 中对字符串进行处理的工具包的使用。
- 准备工作
在 maven项目中导入guava依赖。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
连接器[Joiner]
@Test
public void test() {
//连接字符串中的非空字符串
Joiner joiner = Joiner.on("->").skipNulls();
System.out.println(joiner.join("Messi", null, "Henry", "Lionel"));//Messi->Henry->Lionel
//用指定字符串,如A 替换空字符串
joiner = Joiner.on("->").useForNull("A");
System.out.println(joiner.join("Messi", null, "Henry", "Lionel"));//Messi->A->Henry->Lionel
//数组转换为字符串,中间以逗号隔开
System.out.println(Joiner.on(",").join(Arrays.asList(1, 2, 3)));//1,2,3
}
拆分器[Splitter]
- 拆分器方法。
方法 | 描述 | 范例 |
---|---|---|
Splitter.on(char) | 按单个字符拆分 | Splitter.on(‘,’) |
Splitter.on(CharMatcher) | 按字符匹配器拆分 | Splitter.on(CharMatcher.BREAKING_WHITESPACE) |
Splitter.on(String) | 按字符串拆分 | Splitter.on(“abc“) |
Splitter.on(Pattern),Splitter.onPattern(String) | 按正则表达式拆分 | Splitter.onPattern(“\r?\n”) |
Splitter.fixedLength(int) | 按固定长度拆分;最后一段可能比给定长度短,但不会为空。 | Splitter.fixedLength(3) |
- 拆封器修饰符
方法 | 描述 |
---|---|
omitEmptyStrings() | 从结果中自动忽略空字符串 |
trimResults() | 移除结果字符串的前导空白和尾部空白 |
trimResults(CharMatcher) | 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符 |
limit(int) | 限制拆分出的字符串数量 |
- 代码示例
@Test
public void test1() {
String[] res = " foo,bar,, qux ".split(",");
for (String item : res) {
System.out.print(item + "->");//foo->bar->-> qux->
}
//忽略字符串中的所有空串
Iterable<String> iterable = Splitter.on(",").trimResults().omitEmptyStrings().split(" foo,bar,, qux ");
for (String item : iterable) {
System.out.print(item + "->");//foo->bar->qux->
}
}
字符匹配器[CharMatcher]
CharMatcher提供了多种处理字符串处理的方法,其主要意图是:
- 找到匹配的字符;
- 处理匹配的字符。
对应上面两种意图,CharMatcher 内部实现也包含两部分:
- 实现大量共用内部类,用来方便匹配字符;
- 实现了许多处理字符串的方法,来处理匹配的字符。
常见的方法有:
方法 | 描述 |
---|---|
removeFrom(CharSequence) | 从字符序列中移除所有匹配字符。 |
retainFrom(CharSequence) | 在字符序列中保留匹配字符,移除其他字符。 |
trimFrom(CharSequence) | 移除字符序列的前导匹配字符和尾部匹配字符。 |
matchesAllOf(CharSequence) | 测试是否字符序列中的所有字符都匹配。 |
下面来看看对 CharMatcher 的示例,中间含有对应的注释,可以很好地理解程序的意思。
@Test
public void test3() {
//去掉控制符,如(\t,\n,\b,...)
String noControl = CharMatcher.JAVA_ISO_CONTROL.removeFrom("messi\t\n");
System.out.println(noControl);//messi
//只保留数字字符
String theDigits = CharMatcher.DIGIT.retainFrom("messi1 2 3");
System.out.println(theDigits);//123
//去掉两端的空格,并把中间的连续空格替换成单个空格
String spaced = CharMatcher.WHITESPACE.trimAndCollapseFrom(" me ssi", '/');
System.out.println(spaced);//me/ssi
//所有数字替换成*
String noDigits = CharMatcher.JAVA_DIGIT.replaceFrom("messi123431j", '*');
System.out.println(noDigits);//messi******j
//只保留数字和小写字母
String lowerAndDigit = CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom("MessiF123Fne");
System.out.println(lowerAndDigit);//essi123ne
//获取所有的大写字母
String digit = CharMatcher.JAVA_UPPER_CASE.retainFrom("JiangF123Fne");
System.out.println(digit);//JFF
//枚举匹配字符
String anyOf = CharMatcher.anyOf("aeiou").retainFrom("good");
System.out.println(anyOf);//oo
//单一字符匹配
String isChar = CharMatcher.is('a').retainFrom("goaad");
System.out.println(isChar);//aa
//给定字符范围匹配
String inRange = CharMatcher.inRange('a', 'z').retainFrom("adfc1234fg45d");
System.out.println(inRange);//adfcfgd
}
字符集[Charsets]
@Test
public void test4() {
String str = "中国";
/*try {
byte[] bytes = str.getBytes("UTF-8");
for (byte byte1 : bytes) {
System.out.print(byte1 + " ");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}*/
//显然第二种方法更加简便
byte[] bytes = str.getBytes(Charsets.UTF_8);
for (byte byte1 : bytes) {
System.out.print(byte1 + " ");
}
}
以上两种方法的结果是一样的,很明显,第二种方法不用处理异常,更加简便。
大小写格式[CaseFormat]
格式 | 说明 |
---|---|
LOWER_CAMEL | Java变量的命名规则,如“lowerCamel”。 |
LOWER_HYPHEN | 连字符连接变量的命名规则,如“lower-hyphen”。 |
LOWER_UNDERSCORE | C ++变量命名规则,如“lower_underscore”。 |
UPPER_CAMEL | Java和C++类的命名规则,如“UpperCamel”。 |
UPPER_UNDERSCORE | Java和C++常量的命名规则,如“UPPER_UNDERSCORE”。 |
@Test
public void test5() {
String text = "lionel_messi";
String text1 = "lionel-messi";
String upperUnderscore = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "LionelMessi");//
System.out.println(upperUnderscore);
System.out.println(CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, text1));//lionelMessi
System.out.println(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, text));//lionelMessi
System.out.println(CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, text));//LionelMessi
}