一、概述
在本教程中,我们将学习多种在Java 中将String截断为所需字符数的方法。
我们将从探索使用JDK 本身执行此操作的方法开始。然后我们将看看如何使用一些流行的第三方库来做到这一点。
2.使用JDK 截断String
Java 提供了许多方便的方法来截断String。让我们来看看。
2.1。使用**String'的substring()** 方法
String类带有一个方便的方法,称为substring.顾名思义, substring()返回给定String在指定索引之间的部分。
让我们看看它的实际效果:
static String usingSubstringMethod(String text, int length) {
if (text.length() <= length) {
return text;
} else {
return text.substring(0, length);
}
}在上面的例子中,如果指定的length大于text的长度,我们返回text本身。这是因为传递给substring()的length大于String中的字符数会导致IndexOutOfBoundsException。
否则,我们返回从索引0 开始并扩展到(但不包括)索引length.
让我们使用一个测试用例来确认这一点:
static final String TEXT = "Welcome to baeldung.com";
@Test
public void givenStringAndLength_whenUsingSubstringMethod_thenTrim() {
assertEquals(TrimStringOnLength.usingSubstringMethod(TEXT, 10), "Welcome to");
}正如我们所看到的,开始索引是包含的,结束索引是排除的。因此,索引length处的字符将不会包含在返回的子字符串中。
2.2.使用String'的split() 方法
另一种截断String的方法是使用split()方法,该方法使用正则表达式将String拆分为多个片段。
在这里,我们将使用一个名为positive lookbehind 的正则表达式功能来匹配从String开头开始的指定数量的字符:
static String usingSplitMethod(String text, int length) {
String[] results = text.split("(?<=\\G.{" + length + "})");
return results[0];
}results的第一个元素将是我们截断的String,或者如果length大于text,则为原始String。
让我们测试一下我们的方法:
@Test
public void givenStringAndLength_whenUsingSplitMethod_thenTrim() {
assertEquals(TrimStringOnLength.usingSplitMethod(TEXT, 13), "Welcome to ba");
}2.3.使用Pattern类
类似地,我们可以使用Pattern类来编译一个正则表达式,它匹配String的开头直到指定数量的字符。
例如,让我们使用{1,” + length + “}.此正则表达式匹配至少一个且最多length字符:
static String usingPattern(String text, int length) {
Optional<String> result = Pattern.compile(".{1," + length + "}")
.matcher(text)
.results()
.map(MatchResult::group)
.findFirst();
return result.isPresent() ? result.get() : EMPTY;
}正如我们在上面看到的,在将我们的正则表达式编译成Pattern之后,我们可以使用Pattern's matcher()方法根据该正则表达式来解释我们的String。然后我们可以对结果进行分组并返回第一个,也就是我们截断的String。
现在让我们添加一个测试用例来验证我们的代码是否按预期工作:
@Test
public void givenStringAndLength_whenUsingPattern_thenTrim() {
assertEquals(TrimStringOnLength.usingPattern(TEXT, 19), "Welcome to baeldung");
}2.4.使用CharSequence'scodePoints()方法
Java 9 提供了一个codePoints()方法来将String转换为代码点值流。
让我们看看如何使用此方法与流API 相结合来截断字符串:
static String usingCodePointsMethod(String text, int length) {
return text.codePoints()
.limit(length)
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
}在这里,我们使用limit()方法将Stream限制为给定的length。然后我们使用StringBuilder来构建我们的截断字符串。
接下来,让我们验证我们的方法是否有效:
@Test
public void givenStringAndLength_whenUsingCodePointsMethod_thenTrim() {
assertEquals(TrimStringOnLength.usingCodePointsMethod(TEXT, 6), "Welcom");
}3. Apache Commons 库
Apache Commons Lang 库包含一个用于操作String的StringUtils类。
首先,让我们将Apache Commons依赖项添加到我们的pom.xml中:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency>
3.1。使用StringUtils's left()方法
StringUtils有一个有用的static方法,称为left()。StringUtils.left()以null 安全的方式返回String最左边的指定数量的字符:
static String usingLeftMethod(String text, int length) {
return StringUtils.left(text, length);
}3.2.使用StringUtils'的truncate()方法
或者,我们可以使用StringUtils.truncate()来实现相同的目标:
public static String usingTruncateMethod(String text, int length) {
return StringUtils.truncate(text, length);
}4. 番石榴图书馆
除了使用核心Java 方法和Apache Commons 库来截断String之外,我们还可以使用Guava。让我们首先将Guava依赖项添加到我们的pom.xml文件中:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.0.1-jre</version> </dependency>
现在我们可以使用Guava 的Splitter类来截断我们的String:
static String usingSplitter(String text, int length) {
Iterable<String> parts = Splitter.fixedLength(length)
.split(text);
return parts.iterator()
.next();
}我们使用Splitter.fixedLength()将我们的String拆分为给定length的多个部分。然后,我们返回结果的第一个元素。
5. 结论
在本文中,我们学习了多种在Java 中将String截断为特定数量字符的方法。
我们研究了一些使用JDK 执行此操作的方法。然后我们使用几个第三方库截断了String。
0 评论