Apache Commons Text 简介
1. 概述
简而言之,Apache Commons Text 库包含许多有用的实用方法,用于处理String,超出了核心 Java 提供的功能。
在这个快速介绍中,我们将了解 Apache Commons Text 是什么,它的用途,以及使用该库的一些实际示例。
2. Maven依赖
让我们首先将以下 Maven 依赖项添加到我们的pom.xml中:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.1</version>
</dependency>
您可以在Maven 中央存储库中找到该库的最新版本。
3. 概述
根包org.apache.commons.text分为不同的子包:
- org.apache.commons.text.diff - String之间的差异
- org.apache.commons.text.similarity - String之间的相似性和距离
- org.apache.commons.text.translate – 翻译文本
让我们更详细地了解每个包的用途。
4. 处理文本
org.apache.commons.text包包含多个用于处理String的工具。
例如,WordUtils的 API 能够将字符串中每个单词的首字母大写、交换字符串的大小写以及检查String是否包含给定数组中的所有单词。
让我们看看如何将String中每个单词的首字母大写:
@Test
public void whenCapitalized_thenCorrect() {
String toBeCapitalized = "to be capitalized!";
String result = WordUtils.capitalize(toBeCapitalized);
assertEquals("To Be Capitalized!", result);
}
以下是我们如何检查字符串是否包含数组中的所有单词:
@Test
public void whenContainsWords_thenCorrect() {
boolean containsWords = WordUtils
.containsAllWords("String to search", "to", "search");
assertTrue(containsWords);
}
StrSubstitutor提供了一种从模板构建String的便捷方法:
@Test
public void whenSubstituted_thenCorrect() {
Map<String, String> substitutes = new HashMap<>();
substitutes.put("name", "John");
substitutes.put("college", "University of Stanford");
String templateString = "My name is ${name} and I am a student at the ${college}.";
StrSubstitutor sub = new StrSubstitutor(substitutes);
String result = sub.replace(templateString);
assertEquals("My name is John and I am a student at the University of Stanford.", result);
}
StrBuilder是Java.lang.StringBuilder的替代品。它提供了一些StringBuilder没有提供的新特性。
例如,我们可以替换另一个String中所有出现的String,或者清除一个String,而无需为其引用分配一个新对象。
这是一个替换部分String的快速示例:
@Test
public void whenReplaced_thenCorrect() {
StrBuilder strBuilder = new StrBuilder("example StrBuilder!");
strBuilder.replaceAll("example", "new");
assertEquals(new StrBuilder("new StrBuilder!"), strBuilder);
}
要清除String,我们可以简单地通过调用构建器上的*clear()*方法来完成:
strBuilder.clear();
5. 计算String之间的差异
org.apache.commons.text.diff包实现了 Myers 算法来计算两个String之间的差异。
两个String之间的差异由一系列修改定义,这些修改可以将一个String转换为另一个String。
可以使用三种类型的命令将String转换为另一个 - InsertCommand、KeepCommand和DeleteCommand。
EditScript对象包含应该运行的脚本,以便将String转换为另一个字符串。让我们计算一下为了将一个String转换为另一个字符串应该进行的单字符修改的数量:
@Test
public void whenEditScript_thenCorrect() {
StringsComparator cmp = new StringsComparator("ABCFGH", "BCDEFG");
EditScript<Character> script = cmp.getScript();
int mod = script.getModifications();
assertEquals(4, mod);
}
6. String之间的异同
org.apache.commons.text.similarity包包含用于查找String之间的相似性和距离的算法。
例如,LongestCommonSubsequence可用于查找两个Strings中常见字符的数量:
@Test
public void whenCompare_thenCorrect() {
LongestCommonSubsequence lcs = new LongestCommonSubsequence();
int countLcs = lcs.apply("New York", "New Hampshire");
assertEquals(5, countLcs);
}
同样,LongestCommonSubsequenceDistance可用于查找两个Strings中不同字符的数量:
@Test
public void whenCalculateDistance_thenCorrect() {
LongestCommonSubsequenceDistance lcsd = new LongestCommonSubsequenceDistance();
int countLcsd = lcsd.apply("New York", "New Hampshire");
assertEquals(11, countLcsd);
}
7.文本翻译
org.apache.text.translate包最初是为了允许我们自定义StringEscapeUtils提供的规则而创建的。
该包有一组类,它们负责将文本转换为一些不同的字符编码模型,例如 Unicode 和数字字符参考。我们还可以创建自己的自定义翻译程序。
让我们看看如何将String转换为其等效的 Unicode 文本:
@Test
public void whenTranslate_thenCorrect() {
UnicodeEscaper ue = UnicodeEscaper.above(0);
String result = ue.translate("ABCD");
assertEquals("\\u0041\\u0042\\u0043\\u0044", result);
}
在这里,我们将要开始翻译的字符的索引传递给*above()*方法。
LookupTranslator使我们能够定义自己的查找表,其中每个字符都可以有一个对应的值,我们可以将任何文本翻译成其对应的等价物。