掌握Guava字符处理工具:让你的代码更易读、高效

2023-12-16 18:42:40

?

推荐语

请允许我自夸一下,这确实是一篇精彩的技术文章,它深入介绍了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 &amp; World!</root>";
    Escaper escaper = XmlEscapers.xmlContentEscaper();
    String escapedText = escaper.escape(xmlText);
    System.out.println("Escaped Text: " + escapedText);
}

写在最后

在软件开发中,处理字符是一项常见而重要的任务。而如果你正在寻找一款功能强大、易于使用的字符处理工具,那么不妨关注一下Google Guava库中的字符工具。本文为你详细介绍Guava库中字符工具的使用方法,让你在处理字符相关的业务时X游刃有余。无论你是初学者还是有经验的开发者,这篇文章都会帮助你更好地理解和应用Guava库中的字符工具,如果觉得篇文章还不错,不妨给这篇文章点赞和关注,给我一些鼓励,谢谢!

文章来源:https://blog.csdn.net/fox9916/article/details/135035335
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。