如何在Java中获取字符串的最后几个字符,无论字符串大小。

95

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

"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,然后使用该模式匹配你的字符串,创建一个正则表达式 Matcher 和一个 ArrayList,最后返回 String[]。这将相对较慢,并且会分配比解决此问题所需更多的内存。是否重要取决于你的应用程序的性质。我通常避免使用 split(),除非我真的需要它。(请注意,如果你在单个字符上拆分,则 split() 不使用正则表达式。) - rjb1290
11个回答

163

怎么样:

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为null,它仍将抛出异常。


非常酷...... - linjiejun

111

有很多事情可以做。

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

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

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

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

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

该函数将所有数字序列拆分出来;数字数组的最后一个元素可能是您想要的。


5
lastIndexOf 方法的一个意外之喜在于,如果字符串中没有空格,则 lastIndexOf 会返回 -1,这样你就会得到整个字符串(s.substring(0))。 - Jon Skeet
s.substring(s.lastIndexOf(':') + 1); 这段代码我想使用,但是如何获取第一个冒号后面的字母呢?难道不应该是 s.indexOf(":", 1) 吗? - PuppyKevin

74

这个问题是“Java String Right”在谷歌上的顶部搜索结果。

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

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

这也处理了text为null的情况,其他许多答案可能会抛出NullPointerException。


2
我也很好奇。这种方式比处理所有可能的问题更安全。 - Jaroslav Kuboš
这也是唯一可行的答案,如果你想/需要一个单独的表达式来安全地将某些内容转换为字符串并获取最后的 n 个字符。例如,您可以执行 StringUtils.right(Objects.toString(someObj), 7) - rjb1290

26

这段代码对我来说完美运作:

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

8
您可以使用这一行代码来实现:
String numbers = text.substring(text.length() - 7, text.length());

如果输入的字符串长度小于7,请确保捕获异常。

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


1
最好事先检查输入长度是否为7或更长,然后再进行子字符串操作。 - orique

4
我会使用 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) ;
    } 

2
正则表达式应该是[0-9]{7}$,以确保它匹配最后7位数字。 - whiskeysierra
@Willi Schönborn:同意。OP的情况表明字符串中的其他组始终包含字母。我假设不需要指定边界。 - FK82

3
String inputstr = "abcd: efg: 1006746"
int startindex = inputstr.length() - 10;
String outputtendigitstr = inputstr.substring(startindex);

请确保检查字符串长度是否大于10。


1

这应该可以工作

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

1

如果字符串的格式是固定的,您可以使用substringAfterLast

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


1

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