推荐语
请允许我自夸一下,这确实是一篇精彩的技术文章,它深入介绍了Guava类库中强大的字符串处理工具。通过本文,你将了解如何巧妙运用这些工具来简化字符串操作、提高代码可读性和性能。不论是字符串拼接、分割、替换还是正则表达式匹配,Guava都提供了丰富的功能和灵活的应用场景。无论您是Java开发者还是对字符串处理感兴趣的技术爱好者,本文将带你领略Guava字符串处理工具的神奇之处,助您掌握高效、优雅的文本操作技巧。
关于Guava的字符处理工具
Guava 提供了丰富的字符处理工具类,让你能够轻松进行字符匹配、转换、拆分、连接和转义等各种操作。这些实用工具类不仅提供了常见的字符处理功能,而且还为你提供了更高效、更简洁的方式来处理字符串。无论是需要对字符串进行灵活的匹配和过滤,还是需要对字符串进行快速的连接和拆分,Guava 的字符处理工具类都能满足你的需求。无需编写繁琐的逻辑代码,你可以直接使用这些工具类来完成各种字符处理任务,让你的代码更加清晰、简洁和易于维护。无论是在日常开发中还是在处理大量文本数据时,Guava 的字符处理工具类都能够为你提供便利,助力你更高效地处理字符串。
Guava的字符处理工具盘点
- CharMatcher:用于进行字符匹配和过滤的工具类。可以使用预定义的匹配器(如数字、字母、空格等)或自定义匹配器进行字符操作。
- CaseFormat:用于不同命名风格(如驼峰、下划线等)之间的转换。提供了多种常见的命名风格格式,并支持自定义格式。
- Strings:提供了一些常见的字符串操作方法,如判空、截取、填充等。包括处理字符串是否为空或 null、填充字符串、截取前几个字符、将 null 转换为空字符串等方法。
- Splitter:用于拆分字符串为指定格式的迭代器。可以按照指定的分隔符、正则表达式或固定长度等方式进行字符串的拆分。
- Joiner:用于连接多个字符串为一个字符串。可以指定连接符、跳过 null 值等。
- Ascii:提供了对 ASCII 字符的常见操作,如大小写转换、判断字符是否为数字或字母等。
- Chars:提供了对 char 类型的常见操作,如将 char 数组转换为字符串、查找字符等。
- HtmlEscapers:用于转义 HTML 字符串中的特殊字符,防止 XSS 攻击。
- XmlEscapers:用于转义 XML 字符串中的特殊字符,防止 XXE 攻击。
Guava的字符串工具如何使用
CharMatcher
CharMatcher类提供了一组方法,用于处理和操作字符。它可以用于字符匹配、修剪、移除、保留等操作,具体如下:
- 字符匹配:CharMatcher可以用来确定一个字符是否匹配某个条件。例如,可以使用isDigit()方法判断一个字符是否为数字字符,或使用isWhitespace()方法判断一个字符是否为空白字符。
@Test
public void test() {
char character = '9';
// 判断字符是否为数字字符
boolean isDigit = CharMatcher.digit().matches(character);
System.out.println(isDigit); // 输出: true
String text = " Hello World! ";
// 判断字符是否为空白字符
boolean isWhitespace = CharMatcher.whitespace().matchesAnyOf(text);
System.out.println(isWhitespace); // 输出: true
}
- 字符修剪:CharMatcher可以用来修剪字符串中的字符。例如,可以使用trimFrom()方法删除字符串开头和结尾的匹配字符,或使用collapseFrom()方法将连续重复的匹配字符替换为单个字符。
@Test
public void test2(){
String text = " Hello World! ";
// 删除字符串开头和结尾的空白字符
String trimmedText = CharMatcher.whitespace().trimFrom(text);
System.out.println(trimmedText); // 输出: Hello World!
String repeatedText = "aaaabbbcccc";
// 将连续重复的字符替换为单个字符
String collapsedText = CharMatcher.is('a').collapseFrom(repeatedText, '-');
System.out.println(collapsedText); // 输出: -bbbcccc
}
- 字符移除:CharMatcher可以用来移除字符串中的特定字符。例如,可以使用removeFrom()方法删除字符串中所有匹配的字符,或使用retainFrom()方法保留字符串中与给定条件匹配的字符,而删除其他字符。
@Test
public void test3(){
String text = "Hello World!";
// 删除字符串中所有的字母字符
String removedText = CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z')).removeFrom(text);
System.out.println(removedText); // 输出: !
// 保留字符串中的数字字符,删除其他字符
String retainedText = CharMatcher.digit().retainFrom(text);
System.out.println(retainedText); // 输出:
}
}
- 字符替换:CharMatcher可以用来替换字符串中的字符。例如,可以使用replaceFrom()方法将字符串中所有匹配的字符替换为指定的字符。
@Test
public void test4(){
String text = "Hello World!";
// 将字符串中所有的空格替换为逗号
String replacedText = CharMatcher.whitespace().replaceFrom(text, ',');
System.out.println(replacedText); // 输出: Hello,World!
}
- 字符统计:CharMatcher可以用来统计字符串中匹配的字符数量。例如,可以使用countIn()方法计算字符串中匹配字符的出现次数。
@Test
public void test5() {
String text = "Hello World!";
// 计算字符串中匹配字符的出现次数
int count = CharMatcher.is('o').countIn(text);
System.out.println(count); // 输出: 2
}
CaseFormat
Guava中的CaseFormat类是一个枚举类型,用于在不同的命名约定之间进行格式转换。
CaseFormat类提供了一组方法,用于将字符串从一种命名约定转换为另一种命名约定。它支持以下几种常见的命名约定:
- LOWER_CAMEL:小驼峰命名法,例如:lowerCamel
- UPPER_CAMEL:大驼峰命名法,也称为帕斯卡命名法,例如:UpperCamel
- LOWER_UNDERSCORE:下划线命名法,例如:lower_underscore
- UPPER_UNDERSCORE:大写下划线命名法,例如:UPPER_UNDERSCORE
CaseFormat类提供了以下主要方法:
- to(CaseFormat targetFormat, CharSequence original):将原始字符串按照指定的目标格式进行转换。
- converterTo(CaseFormat targetFormat):返回一个函数,用于将字符串从当前格式转换为目标格式。
下面是使用CaseFormat类的示例代码:
@Test
public void test2(){
String original = "hello_world";
// 将下划线命名法转换为小驼峰命名法
String lowerCamel = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, original);
System.out.println(lowerCamel); // 输出: helloWorld
// 将小驼峰命名法转换为大写下划线命名法
String upperUnderscore = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, lowerCamel);
System.out.println(upperUnderscore); // 输出: HELLO_WORLD
}
在上述示例中,首先将一个字符串从下划线命名法转换为小驼峰命名法,然后再将小驼峰命名法转换为大写下划线命名法,最终输出结果。
Strings
Google Guava库中的Strings类提供了一些用于处理字符串的实用方法。它包含了一系列静态方法,用于执行字符串的操作和转换。
以下是Strings类的一些常见用法示例:
- 判断字符串是否为空或者为空白字符:
@Test
public void test8() {
String str1 = "";
String str2 = null;
String str3 = " ";
boolean isEmpty1 = Strings.isNullOrEmpty(str1);
System.out.println(isEmpty1); // 输出: true
boolean isEmpty2 = Strings.isNullOrEmpty(str2);
System.out.println(isEmpty2); // 输出: true
boolean isBlank = Strings.isNullOrEmpty(str3);
System.out.println(isBlank); // 输出: true
}
- 获取字符串的长度,如果为null则返回0:
@Test
public void test9() {
String str = "Hello World!";
int length = Strings.nullToEmpty(str).length();
System.out.println(length); // 输出: 12
String nullStr = null;
int nullLength = Strings.nullToEmpty(nullStr).length();
System.out.println(nullLength); // 输出: 0
}
- 填充字符串到指定长度,如果长度不够,则在左侧或右侧添加指定字符:
@Test
public void test10() {
String str = "123";
String paddedLeft = Strings.padStart(str, 10, '0');
System.out.println(paddedLeft); // 输出: 0000000123
String paddedRight = Strings.padEnd(str, 10, '0');
System.out.println(paddedRight); // 输出: 1230000000
}
- 用于查找两个字符串之间的最长公共前缀。如果没有公共前缀,则返回空字符串。在下面的示例中,比较了两对字符串(str1和str2,以及str3和str4)之间的最长公共前缀。第一对字符串有公共前缀"Hello",而第二对字符串没有公共前缀,因此返回了空字符串。
@Test
public void test11() {
String str1 = "Hello World!";
String str2 = "Hello Java!";
String commonPrefix = Strings.commonPrefix(str1, str2);
System.out.println(commonPrefix); // 输出: Hello
String str3 = "Goodbye World!";
String str4 = "Hello Java!";
String noCommonPrefix = Strings.commonPrefix(str3, str4);
System.out.println(noCommonPrefix); // 输出:
}
Splitter
Splitter类是Google Guava库中的一个实用工具类,用于将字符串拆分成多个部分。它提供了一些方法来定义分隔符、处理空白项、限制拆分数量等。主要作用:
- 字符串拆分:通过指定分隔符将字符串拆分成多个部分。可以使用多种不同的分隔符,包括固定字符串、正则表达式、字符匹配器等。在下面的示例中,使用逗号,作为分隔符将字符串str拆分成多个部分;
@Test
public void test12() {
String str = "One,Two,Three";
Iterable<String> parts = Splitter.on(',')
.split(str);
for (String part : parts) {
System.out.println(part);
}
}
- 过滤空白项:可以过滤掉拆分结果中的空白项,例如连续的分隔符、拆分后的空字符串等。在下面的示例中,使用逗号,作为分隔符将字符串str拆分成多个部分。使用omitEmptyStrings()方法过滤掉空字符串,使用trimResults()方法去除每个部分的前导和尾随空白。
@Test
public void test13() {
String str = "One,,Two, , Three";
Iterable<String> parts = Splitter.on(',')
.omitEmptyStrings()
.trimResults()
.split(str);
for (String part : parts) {
System.out.println(part);
}
}
- 限制拆分数量:可以设置最大拆分数量,仅将字符串拆分为指定数量的部分。在下面的示例中,使用逗号,作为分隔符将字符串str拆分成多个部分。使用limit(3)方法将拆分部分的数量限制为3个。
@Test
public void test14() {
String str = "One,Two,Three,Four,Five";
Iterable<String> parts = Splitter.on(',')
.limit(3)
.split(str);
for (String part : parts) {
System.out.println(part);
}
}
Joiner
Joiner类是Google Guava库中的一个实用工具类,用于将多个对象或元素连接成一个字符串。它提供了一些方法来定义连接符、处理空值、跳过Null值等。主要作用如下:
- 对象连接:将多个对象或元素连接成一个字符串。可以连接任意类型的对象,包括基本数据类型、集合、数组等。在下面的示例中,使用Joiner将字符串数组names中的元素连接成一个字符串,每个元素之间使用逗号和空格分隔。
@Test
public void test15() {
String[] names = {"Alice", "Bob", "Charlie"};
String result = Joiner.on(", ")
.join(names);
System.out.println(result);
}
- 处理空值:可以定义在连接过程中如何处理空值。可以选择跳过空值、将其视为普通字符串、使用自定义占位符代替空值等。在下面的示例中,使用Joiner将字符串数组names中的元素连接成一个字符串,每个元素之间使用逗号和空格分隔。使用useForNull("Unknown")方法将空值替换为自定义的占位符"Unknown"。
@Test
public void test16() {
String[] names = {"Alice", "Bob", null, "Charlie"};
String result = Joiner.on(", ")
.useForNull("Unknown")
.join(names);
System.out.println(result);
}
- 跳过Null值:可以选择跳过Null值,不包含在最终的连接结果中。在下面的示例中,使用Joiner将字符串列表names中的元素连接成一个字符串,每个元素之间使用逗号和空格分隔。使用skipNulls()方法跳过空值。
@Test
public void test17() {
List<String> names = Lists.newArrayList("Alice", "Bob", null, "Charlie");
String result = Joiner.on(", ")
.skipNulls()
.join(names);
System.out.println(result);
}
Ascii
Ascii类是Google Guava库中的一个实用工具类,提供了一些对ASCII字符的处理方法。它可以帮助您处理和转换ASCII字符,执行ASCII字符相关的操作。Ascii类的主要作用如下:
- 字符判断:Ascii类提供了一系列的方法来进行ASCII字符的判断。例如,isLowerCase(char)用于判断字符是否为小写字母,isUpperCase(char)用于判断字符是否大写字母等。在下面示例中,使用Ascii类的方法判断字符ch是否为小写字母、大写字母。
@Test
public void test1() {
char ch = 'a';
boolean isLowerCase = Ascii.isLowerCase(ch);
boolean isUpperCase = Ascii.isUpperCase(ch);
System.out.println("Is lowercase? " + isLowerCase);
System.out.println("Is isUpperCase? " + isUpperCase);
}
- 字符转换:Ascii类提供了一些方法来进行ASCII字符的转换。例如,toUpperCase(char)用于将字符转换为大写形式,toLowerCase(char)用于将字符转换为小写形式,toChar(int)用于将ASCII码转换为字符等。在下面示例中,使用Ascii类的方法将字符ch转换为大写形式和小写形式。
@Test
public void test2() {
char ch = 'a';
char upperCaseCh = Ascii.toUpperCase(ch);
char lowerCaseCh = Ascii.toLowerCase(ch);
System.out.println("Uppercase character: " + upperCaseCh);
System.out.println("Lowercase character: " + lowerCaseCh);
}
- 字符处理:Ascii类还提供了一些处理ASCII字符的方法。例如,truncate(CharSequence, int, CharSequence)用于截断字符串并在末尾添加截断标记,wrap(CharSequence, int)用于在指定的宽度处将字符串拆分为多行等。在下面示例中,使用Ascii类的方法对字符串text进行处理。truncate(CharSequence, int, CharSequence)方法用于截断字符串并在末尾添加截断标记。
@Test
public void test3() {
String text = "Hello, World!";
String truncatedText = Ascii.truncate(text, 10, "...");
System.out.println("Truncated text: " + truncatedText);
}
Chars
Chars类是Guava库中提供的一个工具类,用于操作基本类型char的相关方法。以下是该类的一些常用核心方法:
- asList(char...):将char数组转换为不可变列表(ImmutableList)。
@Test
public void test4() {
List<Character> charList = Chars.asList('a', 'b', 'c');
System.out.println(charList.toString());
}
- compare(char, char):比较两个char值的大小,返回一个整数值。
@Test
public void test5() {
int compareResult = Chars.compare('a', 'b');
System.out.println(compareResult);
}
- concat(char[]...):连接多个char数组为一个新的数组。
@Test
public void test6() {
char[] result = Chars.concat(new char[]{'a', 'b'}, new char[]{'c', 'd'});
System.out.println(result);
}
- contains(char[], char):检查一个char值是否在数组中。
@Test
public void test6() {
char[] result = Chars.concat(new char[]{'a', 'b'}, new char[]{'c', 'd'});
System.out.println(result);
}
- indexOf(char[], char):查找指定char值在数组中的索引,若不存在则返回-1。
@Test
public void test8() {
int index = Chars.indexOf(new char[]{'a', 'b', 'c'}, 'b');
System.out.println(index);
}
- join(String, char...):使用指定的分隔符将char数组连接为字符串。
@Test
public void test9() {
String joinedString = Chars.join(",", 'a', 'b', 'c'); // "a,b,c"
System.out.println(joinedString);
}
- max(char...):返回最大的char值。
@Test
public void test10() {
char maxChar = Chars.max('a', 'b', 'c');
System.out.println(maxChar);
}
- min(char...):返回最小的char值。
@Test
public void test11() {
char minChar = Chars.min('a', 'b', 'c');
System.out.println(minChar);
}
- toArray(Collection):将Character集合转换为char数组。
@Test
public void test12() {
Character[] characters = { 'a', 'b', 'c' };
char[] charArray = Chars.toArray(Arrays.asList(characters));
System.out.println(charArray);
}
HtmlEscapers
HtmlEscapers类是Guava库中提供的一个实用工具类,用于将文本中的HTML特殊字符进行转义(escape)。其主要作用是防止在HTML页面中展示文本时,出现被误认为是HTML标签的风险,从而避免潜在的安全问题和错误的展示效果。
HtmlEscapers#htmlEscaper():获取一个将HTML特殊字符进行转义的Escaper对象。在下面的示例中,先获取一个Escaper对象,然后调用Escaper#escape()对html文本进行转义;
@Test
public void test13() {
String escapedText = HtmlEscapers.htmlEscaper().escape("<script>alert('Hello World');</script>");
System.out.println(escapedText);
}
XmlEscapers
XmlEscapers是Google Guava库中的一个类,提供了一种方便的方式来处理XML文本中的特殊字符,确保文本在显示或存储时的正确性。其主要就是对XML文本进行转义:
转义XML特殊字符:XmlEscapers.xmlContentEscaper()方法返回一个Escaper对象,通过调用该对象的escape(String)方法,可以将XML文本中的特殊字符(如, &, ", '等)替换为相应的XML实体编码。例如:XmlEscapers.xmlContentEscaper().escape("Hello & World!")将返回Hello & World!。
@Test
public void test14() {
// 转义XML特殊字符
String xmlText = "<root>Hello & World!</root>";
Escaper escaper = XmlEscapers.xmlContentEscaper();
String escapedText = escaper.escape(xmlText);
System.out.println("Escaped Text: " + escapedText);
}
写在最后
在软件开发中,处理字符是一项常见而重要的任务。而如果你正在寻找一款功能强大、易于使用的字符处理工具,那么不妨关注一下Google Guava库中的字符工具。本文为你详细介绍Guava库中字符工具的使用方法,让你在处理字符相关的业务时X游刃有余。无论你是初学者还是有经验的开发者,这篇文章都会帮助你更好地理解和应用Guava库中的字符工具,如果觉得篇文章还不错,不妨给这篇文章点赞和关注,给我一些鼓励,谢谢!