一、概述
在本教程中,我们将学习多种在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 评论