根据string长度修剪一个string

如果长度超过10个字符,我想修剪一个string。

假设如果string长度是12( String s="abcdafghijkl" ),那么新的修剪string将包含"abcdefgh.."

我怎样才能做到这一点?

 s = s.substring(0, Math.min(s.length(), 10)); 

像这样使用Math.min可避免在string已经小于10的情况下出现exception。


笔记:

  1. 以上是真正的修剪。 如果实际上想要用点replace最后三个(!)字符,那么使用Apache Commons StringUtils.abbreviate

  2. 如果您的string包含BMP以外的Unicode代码点,则这可能performance错误1 ; 如Emojis。 有关适用于所有Unicode代码点的解决scheme ,请参阅@ sibnick的解决scheme 。


1 – 不在平面0(BMP)上的Unicode代码点在String表示为“代理对”(即两个char值)。 通过忽略这一点,我们可以修剪到less于10个代码点,或者(更糟糕的)在代理对中间截断。 另一方面, String.length()不再是衡量Unicode文本长度的一个理想方法,所以基于它的修改可能是错误的。

Apache Commons Lang库中的StringUtils.abbreviate可能是您的朋友:

 StringUtils.abbreviate("abcdefg", 6) = "abc..." StringUtils.abbreviate("abcdefg", 7) = "abcdefg" StringUtils.abbreviate("abcdefg", 8) = "abcdefg" StringUtils.abbreviate("abcdefg", 4) = "a..." 

有一个StringUtils函数可以做到这一点。

 s = StringUtils.left(s, 10) 

如果len字符不可用,或者String为空,那么String将被返回而没有exception。 如果len为负,则返回空string。

StringUtils.left(null, )= null
StringUtils.left( ,-ve)=“”
StringUtils.left(“”,*)=“”
StringUtils.left(“abc”,0)=“”
StringUtils.left(“abc”,2)=“ab”
StringUtils.left(“abc”,4)=“abc”

StringUtils.Left JavaDocs

礼貌:Steeve McCauley

s = s.length() > 10 ? s.substring(0, 9) : s;

像往常一样,没有人关心UTF-16代理对。 看看他们: 实际使用中最常见的非BMP Unicode字符是什么? 甚至是org.apache.commons / commons-lang3的作者

您可以在此示例中看到正确代码和常用代码之间的区别:

 public static void main(String[] args) { //string with FACE WITH TEARS OF JOY symbol String s = "abcdafghi\uD83D\uDE02cdefg"; int maxWidth = 10; System.out.println(s); //do not care about UTF-16 surrogate pairs System.out.println(s.substring(0, Math.min(s.length(), maxWidth))); //correctly process UTF-16 surrogate pairs if(s.length()>maxWidth){ int correctedMaxWidth = (Character.isLowSurrogate(s.charAt(maxWidth)))&&maxWidth>0 ? maxWidth-1 : maxWidth; System.out.println(s.substring(0, Math.min(s.length(), correctedMaxWidth))); } } 

或者你可以使用这个方法,以防你没有StringUtils:

 public static String abbreviateString(String input, int maxLength) { if (input.length() <= maxLength) return input; else return input.substring(0, maxLength-2) + ".."; } 

以防万一你正在寻找一种方法来修剪和保留string的最后10个字符。

s = s.substring(Math.max(s.length(),10) – 10);