根据字符串长度修剪字符串

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

假设字符串长度为12(String s="abcdafghijkl") ,那么新修剪的字符串将包含 "abcdefgh.."

我怎么才能做到呢?

305872 次浏览
s = s.substring(0, Math.min(s.length(), 10));

像这样使用 Math.min可以避免字符串已经比 10短的情况出现异常。


备注:

  1. 以上做了简单的修剪。如果字符串太长,您实际上希望用三个点替换最后一个字符,请使用 Apache Commons StringUtils.abbreviate; 请参阅@H6的 解决方案。如果要使用 Unicode 水平省略号字符,请参见@Basil 的 解决方案

  2. 对于 String的典型实现,s.substring(0, s.length())将返回 s,而不是分配一个新的 String

  3. 如果你的字符串包含 BMP 之外的 Unicode 代码点,例如表情符号,这可能表现不正确 1。有关适用于所有 Unicode 代码点的(更复杂的)解决方案,请参见@sibnick 的 解决方案


1-不在平面0(BMP)上的 Unicode 代码点在 String中表示为“代理对”(即两个 char值)。通过忽略这一点,我们可以将字符串修剪到少于10个代码点,或者(更糟糕的是)在代理对的中间截断它。另一方面,String.length()不能很好地度量 Unicode 文本长度,因此根据该属性进行修剪可能是错误的。

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

来自 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..."

Commons Lang3 甚至允许将自定义 String 设置为替换标记。例如,您可以使用这种方法设置单个字符的省略号。

StringUtils.abbreviate("abcdefg", "\u2026", 6) = "abcde…"

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

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

像往常一样,没有人关心 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)));
}
}

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

s = StringUtils.left(s, 10)

如果 len 字符不可用,或 String 为 null,则将无异常地返回 String。如果 len 为负,则返回空 String。

Left (null,< em >) = null
Left ( ,-ve) = “”< br/> Left (“”,*) = “”
Left (“ abc”,0) = “”
Left (“ abc”,2) = “ ab”
Left (“ abc”,4) = “ abc”

StringUtils,左边的 JavaDocs

提供者: Steve McCauley

以防万一,您正在寻找一种方法来修剪和保持字符串的最后10个字符。

s = s.substring(Math.max(s.length(),10) - 10);
str==null ? str : str.substring(0, Math.min(str.length(), 10))

或者,

str==null ? "" : str.substring(0, Math.min(str.length(), 10))

与空一起工作。

Java 提出了这个问题,但那是在2014年。
如果你现在使用 Kotlin,它非常简单:

yourString.take(10)

返回包含此字符串的前 n 个字符的字符串,如果此字符串较短,则返回整个字符串。

文件

博士

你似乎要求在最后一个地方的 省略号()字符,当截断。下面是一个用于操作输入字符串的一行程序。

String input = "abcdefghijkl";
String output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;

看这个 代码在 IdeOne.com 上运行。

Abcdefghi...

三元操作员

我们可以使用 三元运算符三元运算符制作一行程序。

String input = "abcdefghijkl" ;


String output =
( input.length() > 10 )          // If too long…
?
input
.substring( 0 , 10 - 1 )         // Take just the first part, adjusting by 1 to replace that last character with an ellipsis.
.concat( "…" )                   // Add the ellipsis character.
:                                // Or, if not too long…
input                            // Just return original string.
;

看这个 代码在 IdeOne.com 上运行。

Abcdefghi...

Java 流

JavaStreams 工具使这个问题变得有趣,从 Java9到更高版本都是如此。

我们使用 密码点而不是 char值。char类型是遗留的,并且仅限于 一部分所有可能的 Unicode字符。

String input = "abcdefghijkl" ;
int limit = 10 ;
String output =
input
.codePoints()
.limit( limit )
.collect(                                    // Collect the results of processing each code point.
StringBuilder::new,                  // Supplier<R> supplier
StringBuilder::appendCodePoint,      // ObjIntConsumer<R> accumulator
StringBuilder::append                // BiConsumer<R,​R> combiner
)
.toString()
;

如果有多余的字符被截断,请用 省略号替换最后一个字符。

if ( input.length () > limit )
{
output = output.substring ( 0 , output.length () - 1 ) + "…";
}

如果我能想到一种方法将流线与“ If over limit,do  省略”部分放在一起就好了。

//这就是缩短字符串长度的方法。 //向类中添加以下方法

private String abbreviate(String s){
if(s.length() <= 10) return s;
return s.substring(0, 8) + ".." ;
}