【问题标题】:How to get the last characters in a String in Java, regardless of String size无论字符串大小如何,如何在 Java 中获取字符串中的最后一个字符
【发布时间】:2010-07-14 06:01:28
【问题描述】:

我正在寻找一种从字符串中提取最后一个字符的方法,无论大小。让我们以这些字符串为例:

"abcd: efg: 1006746"
"bhddy: nshhf36: 1006754"
"hfquv: nd: 5894254"

如您所见,完全随机的字符串,但最后有 7 个数字。我怎么能得到这 7 个数字?

编辑:

我刚刚意识到 String[] string = s.split(": "); 在这里会很好用,只要我为数字调用 string[2] 并为中间的任何内容调用 string[1]。

【问题讨论】:

  • 您的问题和几个答案都提到了String.split(),但值得注意的是s.split(": ") 每次调用它时都会编译一个新的java.uitl.regex.Pattern,然后将您的字符串与该模式匹配,在返回的String[] 之前创建一个正则表达式Matcher 和一个ArrayList。它将相对较慢,并且会分配远远超过解决此问题所需的资源。这是否重要取决于您的应用程序的性质。我通常避免split(),除非我真的需要它。 (请注意,split() 如果您拆分单个字符,使用正则表达式。)

标签: java string


【解决方案1】:

怎么样:

String numbers = text.substring(text.length() - 7);

这当然是假设结尾有 7 个字符。如果您将其传递“12345”,它将引发异常。你可以这样解决:

String numbers = text.substring(Math.max(0, text.length() - 7));

String numbers = text.length() <= 7 ? text : text.substring(text.length() - 7);

请注意,这仍然没有对结果字符串是否包含数字进行任何验证 - 如果 text 为空,它仍然会引发异常。

【讨论】:

  • 非常酷......
【解决方案2】:

你可以做很多事情。

s.substring(s.lastIndexOf(':') + 1);

将获取最后一个冒号之后的所有内容。

s.substring(s.lastIndexOf(' ') + 1);

最后一个空格之后的所有内容。

String numbers[] = s.split("[^0-9]+");

拆分所有数字序列; numbers 数组的最后一个元素可能就是你想要的。

【讨论】:

  • lastIndexOf 方法的一个偶然之处在于,如果 没有 任何空格,lastIndexOf 将返回 -1,因此您最终会得到整个字符串 (s.substring(0))。
  • s.substring(s.lastIndexOf(':') + 1);我想使用它,但是我怎样才能得到第一个冒号之后的字母?不会是 s.indexOf(":", 1) 吗?
【解决方案3】:

此问题是“Java String Right”的最高 Google 搜索结果。

令人惊讶的是,还没有人提到 Apache Commons StringUtils.right()

String numbers = org.apache.commons.lang.StringUtils.right( text, 7 );

这也处理text 为空的情况,其中许多其他答案会抛出 NullPointerException。

【讨论】:

  • 我也想知道。这种方式比处理所有可能的问题要安全得多。
  • 如果您想要/需要一个表达式来安全地将某些内容转换为字符串并直到最后一个 n 字符,这也是唯一有效的答案。例如,您可以使用StringUtils.right(Objects.toString(someObj), 7)
【解决方案4】:

这段代码非常适合我:

String numbers = text.substring(Math.max(0, text.length() - 7));

【讨论】:

    【解决方案5】:

    您可以使用这一行代码来实现它:

    String numbers = text.substring(text.length() - 7, text.length());
    

    但一定要在输入字符串长度小于7时捕获Exception

    如果您想获取最后的“N”个字符,可以将 7 替换为任何数字,例如 N。

    【讨论】:

    • 最好提前检查输入长度是否为7或更长,然后再做子串。
    【解决方案6】:

    我会使用String.split 或正则表达式:


    使用 String.split

    String[] numberSplit = yourString.split(":") ; 
    String numbers = numberSplit[ (numberSplit.length-1) ] ; //!! last array element
    

    使用正则表达式(需要import java.util.regex.*

    String numbers = "" ;
    Matcher numberMatcher = Pattern.compile("[0-9]{7}").matcher(yourString) ;
        if( matcher.find() ) {
                numbers = matcher.group(0) ;
        } 
    

    【讨论】:

    • 正则表达式应该是[0-9]{7}$ 以确保它匹配最后 7 位数字。
    • @Willi Schönborn:同意。 OP 的案例表明字符串中的其他组将始终包含字母。我假设没有必要指定边界。
    【解决方案7】:
    String inputstr = "abcd: efg: 1006746"
    int startindex = inputstr.length() - 10;
    String outputtendigitstr = inputstr.substring(startindex);
    

    确保检查字符串长度是否超过 10。

    【讨论】:

      【解决方案8】:

      这应该可以工作

       Integer i= Integer.parseInt(text.substring(text.length() - 7));
      

      【讨论】:

        【解决方案9】:

        StringUtils.substringAfterLast("abcd: efg: 1006746", ": ") = "1006746";

        只要字符串的格式是固定的,你就可以使用substringAfterLast

        【讨论】:

          【解决方案10】:
          org.apache.commons.lang3.StringUtils.substring(s, -7) 
          

          给你答案。如果输入小于 7,则返回输入,如果 s == null,则返回 null。它从不抛出异常。

          https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#substring-java.lang.String-int-int-

          【讨论】:

            【解决方案11】:

            例如:“abcd: efg: 1006746” “bhddy:nshhf36:1006754” "hfquv: nd: 5894254"

            -第一步:String firstString = "abcd: efg: 1006746";

            -第二步:String lastSevenNumber = firstString.substring(firstString.lastIndexOf(':'), firstString.length()).trim();

            【讨论】:

              猜你喜欢
              • 2011-07-07
              • 2011-08-17
              • 2011-02-10
              • 2013-07-06
              • 2013-11-25
              • 2011-11-18
              • 1970-01-01
              相关资源
              最近更新 更多