0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用JDK截断一个字符串

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-08 15:43 次阅读

在本文中,我们将学习在Java中把一个String截断到所需的字符数的集中方法。

首先,我们将探索使用JDK本身来实现这一目标的方法。然后,我们将研究如何使用一些流行的第三方库来实现这一目标。

使用JDK截断一个字符串

Java提供了许多方便的方法来截断一个 String 。让我们来看看。

使用 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  javanorth.cn";

@Test
public void givenStringAndLength_whenUsingSubstringMethod_thenTrim() {

    assertEquals(TrimStringOnLength.usingSubstringMethod(TEXT, 10), "Welcome to");
}

正如我们所看到的, 的起始索引是包容的,结束索引是排他的 。因此, 索引 length 处的字符将不包括在返回的子串中。

使用 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");
}

使用 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的 matcher() 方法来根据该正则表达式解释我们的 String 。然后我们就可以将结果分组,并返回第一个结果,也就是我们截断的 String 。

现在让我们添加一个测试案例来验证我们的代码是否如预期那样工作。

@Test
public void givenStringAndLength_whenUsingPattern_thenTrim() {

    assertEquals(TrimStringOnLength.usingPattern(TEXT, 19), "Welcome to  javanorth");
}

使用 CharSequence 的 codePoints() 方法

Java 9提供了一个 codePoints() 方法来将一个 String 转换为一个码点值流。

让我们看看如何使用这个方法与 Stream API相结合来截断一个字符串。

static String usingCodePointsMethod(String text, int length) {

    return text.codePoints()
      .limit(length)
      .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
      .toString();
}

在这里,我们使用 limit() 方法来限制 Stream 的长度 。然后我们使用 StringBuilder 来建立我们的截断字符串。

接下来,让我们验证一下我们的方法是否有效。

@Test
public void givenStringAndLength_whenUsingCodePointsMethod_thenTrim() {
    assertEquals(TrimStringOnLength.usingCodePointsMethod(TEXT, 6), "Welcom");
}

Apache Commons 库

Apache Commons Lang 库包括一个 StringUtils 类,用于操作 String。

首先,让我们把Apache Commons dependency添加到我们的 pom.xml 。

< dependency >
    < groupId >org.apache.commons< /groupId >
    < artifactId >commons-lang3< /artifactId >
    < version >3.12.0< /version >
< /dependency >

使用 StringUtils的left() 方法

StringUtils 有一个有用的 静态 方法叫 left() 。 StringUtils.left() 以一种安全的方式返回 String 最左边的指定字符数: 。

static String usingLeftMethod(String text, int length) {

    return StringUtils.left(text, length);
}

使用 StringUtils 的 truncate() 方法

另外,我们可以使用 StringUtils.truncate() 来达到同样的目的。

public static String usingTruncateMethod(String text, int length) {
    return StringUtils.truncate(text, length);
}

Guava库

除了使用核心Java方法和Apache Commons库来截断一个 String 之外,我们还可以使用 Guava。让我们首先把Guava的 dependency 添加到我们的 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 分割成多个给定长度的片段。然后,我们返回结果中的第一个元素。

总结

在这篇文章中,我们学习了在Java中把一个 String 截断为特定数量的字符的各种方法。我们看了一些使用JDK来做这件事的方法。然后,我们使用一些第三方库来截断 String 。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字符串
    +关注

    关注

    1

    文章

    585

    浏览量

    20622
  • 代码
    +关注

    关注

    30

    文章

    4841

    浏览量

    69196
  • JDK
    JDK
    +关注

    关注

    0

    文章

    82

    浏览量

    16642
  • Split
    +关注

    关注

    0

    文章

    6

    浏览量

    5589
收藏 人收藏

    评论

    相关推荐

    请问C语言中如何解析一个字符串

    我是通过WIFI模块获取一个字符串,然后现在想要解析出一个字符,想把那个字符转换成16进制,然后赋值给P0口,
    发表于 10-13 17:59

    labview中已知4个字符串(每个字符串包含一个字符)如何随机排列?

    labview中已知4个字符串(每个字符串包含一个字符)如何随机排列?求大神给程框图。
    发表于 01-22 15:43

    请问使用Mbed库的串口怎么接收一个字符串?

    getc 只能收一个字节.scanf 需要字符串以换行符结尾.如题,就是非阻塞方式接收一个字符串,感谢回复.STM32里有线路空闲中断,Mbed里没用到.
    发表于 03-01 06:17

    如何判断一个字符串开头?

    命令以“$Cmd,”开头,以“,”分隔,以“*”结尾。单片机回复以“$Message,”开头,以“,”分隔,以“*”结尾。如果错误这以“$Message,ERROR,”开头,以“,”分隔,以“*”结尾。我想问我如何判断一个字符串开头,判断一个字符没问题,但判断
    发表于 09-11 22:13

    如何输出连接的字符串中的第一个字符串

    本帖最后由 疃12345 于 2021-4-19 22:11 编辑 如何输出第一个字符串?要求单独输出第一个字符串,不影响这字符串的连接与输出,如图所示,输出数值0.4869
    发表于 04-19 22:07

    解决STM32口丢失第一个字符

    在使用STM32口时可能会发现问题就是发送字符串时第一个字符缺失情况。解决办法在发送字符串
    发表于 12-27 19:28 10次下载
    解决STM32<b class='flag-5'>串</b>口丢失第<b class='flag-5'>一个字符</b>

    MATLAB(5)--字符串处理

    在MATLAB中,字符串是用单引号括起来的字符序列,是把一个字符串当做一个行向量,这个行向量中,每个元素对应一个字符
    的头像 发表于 11-14 16:06 1693次阅读
    MATLAB(5)--<b class='flag-5'>字符串</b>处理

    文详解JavaScript字符串

    JavaScript字符串是原始值。此外,字符串是不可变的。这意味着如果你修改一个字符串,你总是会得到新的
    的头像 发表于 12-08 16:36 1276次阅读

    如何利用Java判断一个字符串是否包含某个字符

    如何利用Java通过不同的方法来判断一个字符串是否包含某个字符。 **2 ****方法** 1. .contains方法
    的头像 发表于 02-17 15:13 1586次阅读
    如何利用Java判断<b class='flag-5'>一个字符串</b>是否包含某<b class='flag-5'>个字符</b>

    C语言字符串的引用方式

    在C语言程序中,字符串是存放在字符数组中的。 2. 用字符数组存放一个字符串,可以通过数组名和下标引用字符串中的
    的头像 发表于 03-10 14:57 2018次阅读

    Python中检查字符串包含的方法

    Python 有多种处理字符串的方法。今天我们介绍如何检查一个字符串中是否包含另一个字符串
    的头像 发表于 05-14 16:02 1.6w次阅读

    代码字符串分割方法

    我们写代码的时候,经常会遇到这样场景,那就是分割字符串。比如说把一个字符串分成N,或者说按照N个字
    的头像 发表于 09-25 11:42 915次阅读

    mysql字符串包含某个字符串

    MySQL是种开源的关系型数据库管理系统,被广泛用于构建Web应用程序和其他大型数据驱动的应用。在进行MySQL数据库查询时,经常需要使用字符串包含操作,即判断一个字符串是否包含另一个字符串
    的头像 发表于 11-16 14:52 3970次阅读

    oracle判断字符串包含某个字符

    字符串操作是任何编程语言中都非常重要的部分,Oracle数据库作为目前最常用的关系型数据库之,也提供了丰富的字符串操作函数和方法。在本文中,我们将详细解析如何在Oracle中判断
    的头像 发表于 12-06 09:53 1.6w次阅读

    字符串反转的实现方式

    在编程中,字符串反转是基础而重要的操作,它涉及到将一个字符串中的字符顺序颠倒过来。这个操作在多种编程语言中都有不同的实现方式,本文将探讨
    的头像 发表于 01-07 15:27 234次阅读