拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何在Java 中截断字符串

如何在Java 中截断字符串

白鹭 - 2022-07-19 2185 0 2

一、概述

在本教程中,我们将学习多种在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 库包含一个用于操作StringStringUtils类。

首先,让我们将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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *