Java:简单的字符串截断方法

4
每次我遇到这种情况,我都会问自己同样的问题:难道没有一种更简单、更不烦人的方法来从字符串末尾截取X个字符吗?
比如说,我有一个字符串 "Helly there bla bla",但是出于某些原因,我需要截掉最后2个字符,得到 "Helly there bla b"。我现在会按照以下步骤操作:
String result = text.substring(0, text.length() - 2);

我更想做类似这样的事情:
String result = text.cutOffEnd(2);

我知道有很多字符串库存在,但我不熟悉很多,并且从未见过像这样的东西,所以我希望你们中的某个人可能更了解它:)
编辑:
问:为什么不构建自己的util方法/类?
答:我不想使用自己的util方法。 我不会为“null或empty”或其他琐事编写一个util方法。 我认为一定已经有这样的功能可用,因为我认为在他们的生命中,许多人经常需要这种函数。 另外:我在许多不同的项目中工作,只想依赖于一个简单的库调用,例如“Strings.nullToEmpty(str)”等。 尽管这很简单,但我不会自己构建这样的东西。
问:为什么text.substring(0,text.length() - 2);不够好?
答:如果与我的所需功能进行比较,则非常笨重。 此外,请考虑以下内容:如果您确定字符串,它甚至变得更加不方便:
String result = otherClass.getComplicatedCalculatedText(par1, par2).substring(0,
otherClass.getComplicatedCalculatedText(par1, par2).length() - 2);

显然,我需要使用一个本地变量,但在这一点上这是非常不必要的...因为它可以简单地是:

String result = otherClass.getComplicatedCalculatedText(par1, par2).cutOffEnd(2);

8
text.substring(text.length() - 2)会返回最后两个字符,并且不会截取掉最后两个字符! - icza
只需创建您自己的字符串工具类。 - user902383
谢谢icza,我也刚刚意识到这一点。这使得代码变得更加臃肿。我已经编辑了问题。 - BAERUS
4个回答

5

通过使用一些字符串库。我建议使用Apache的通用语言库。

对于你的情况,这已经足够了。

import org.apache.commons.lang.StringUtils;
String result = StringUtils.removeEnd( "Helly there bla bla", "la");

0
请查看以下代码。
public class OddNumberLoop {

  public static void main(String[] args) {

    String st1 = "Helly there bla bla";
    String st2 = st1.substring(0, st1.length() - 2);
    System.out.println(st2);

  }

}

祝你好运!!!


我不明白你在做什么,请解释一下。这就是我得到的东西,很笨重和烦人。 - BAERUS
你想要获取st1字符串的最后两个字符之外的部分,因此当我们在Java中使用substring()函数时,需要给出子字符串的起始点和终止点。在我的代码中,我将字符串的第一个字符作为起始点,并将"st1.length() - 2"作为终止点。为了获取终止点,我获取了字符串的长度并减去了2。这意味着从原始(st1)字符串中分离出不包含最后2个字符的新字符串。 - Dhanushka Gayashan
1
这可能听起来有点刻薄,但你完全读懂我的问题了吗?我知道如何使用子字符串来完成它,但正如在入口问题中所述,这种方法很笨重和烦人(在我看来),而且创建一个漂亮的实用程序方法非常容易 - 但为什么没有任何库提供这样的方法呢?这就是我的问题。 - BAERUS

0

标准库中没有此功能的内置实用程序,但是自己编写一个实用方法有多难呢?

public static String cutOffEnd(String s, int n) {
    return s == null || s.length() <= n ? "" : s.substring(0, s.length() - n);
}

包含检查的完整解决方案:

public static String cutOffEnd(String s, int n) {
    if (s == null)
        throw new NullPointerException("s cannot be null!");
    if (n > s.length())
        throw new IllegalArgumentException("n cannot be greater"
                      + " than the length of string!");

    return s.substring(0, s.length() - n);
}

2
我建议不要使用这样的实用方法。它隐藏了原始调用中的npe,用空字符串替换;它还添加到堆栈中;并降低可读性 - 对于这样一个微不足道的快捷方式来保存一个单一的方法参数。 - guido
我不想为自己编写类似的东西,因为我在许多不同的项目中工作,如果有像Strings或StringUtils或其他任何实用程序库那样的实用程序库,那么这将是浪费的努力。不幸的是,到目前为止我还没有找到这样的东西 :/ - BAERUS
@guido 嗯,这只是为了演示目的。完整的解决方案还应该检查 n 是否不大于 String 的长度。 - icza
@icza 是的,我理解这回答了问题,我的评论可能应该放在原帖下面而不是这里。 - guido

0
  • 顺便说一下:通常这样的功能请求是针对Java编译器提出的。通常这些功能对于语言来说并不强制,因此不会被修复
  • 为什么要切断它?如果是为了更高级别的解决方案,那么您需要匹配模式或结构。在这种情况下,您无论如何都应该使用自己的Util-Method进行解析。

一个现实的例子:

String url = "http://www.foo.bar/#abc";
String site = url.substring(0, url.indexOf("#"));
// this shall be extracted into a utils-method 
// anyway like `MyURLParser.cutOfAnchor()`.

在这里询问具体的库是被禁止的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接