如果长度超过10个字符,我想修剪一个字符串。
假设字符串长度为12(String s="abcdafghijkl"
),则新剪裁的字符串将包含"abcdefgh.."
。
我怎样才能做到这一点?
答案 0 :(得分:205)
s = s.substring(0, Math.min(s.length(), 10));
像这样使用Math.min
可以避免在字符串已经短于10
的情况下出现异常。
注意:
上面做了真正的修剪。如果你真的想在截断时用点替换最后三个(!)字符,那么使用Apache Commons StringUtils.abbreviate
。
如果您的String包含BMP之外的Unicode代码点,则此行为可能会错误 1 ;例如表情符号。对于适用于所有Unicode代码点的(更复杂的)解决方案,请参阅@ sibnick的solution。
1 - 不在平面0(BMP)上的Unicode代码点在char
中表示为“代理对”(即两个String
值)。通过忽略这一点,我们可能会修剪到少于10个代码点,或者(更糟糕的是)在代理对中间截断。另一方面,String.length()
不再是Unicode文本长度的理想度量,因此基于它的修剪可能是错误的。
答案 1 :(得分:104)
StringUtils.abbreviate
图书馆的Apache Commons Lang可能是您的朋友:
StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."
答案 2 :(得分:39)
有StringUtils
函数执行此操作。
s = StringUtils.left(s, 10)
如果len个字符不可用,或者String为null,则返回String而不会发生异常。如果len为负数,则返回空字符串。
StringUtils.left(null,)= null
StringUtils.left(, - ve)=""
StringUtils.left("",*)=""
StringUtils.left(" abc",0)=""
StringUtils.left(" abc",2)=" ab"
StringUtils.left(" abc",4)=" abc"
礼貌:Steeve McCauley
答案 3 :(得分:16)
像往常一样,没有人关心UTF-16代理对。看看他们:What are the most common non-BMP Unicode characters in actual use?甚至是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)));
}
}
答案 4 :(得分:10)
s = s.length() > 10 ? s.substring(0, 9) : s;
答案 5 :(得分:4)
以防您正在寻找一种方法来修剪并保留字符串的最后10个字符。
s = s.substring(Math.max(s.length(),10) - 10);
答案 6 :(得分:3)
答案 7 :(得分:1)
截断时,您似乎在要求最后一个ellipsis(…
)字符。这是处理输入字符串的一种方法。
String input = "abcdefghijkl";
String output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;
查看此code run live at IdeOne.com.
abcdefghi ...
我们可以使用ternary operator制成单线纸。
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.
;
查看此code run live at IdeOne.com.
abcdefghi ...
从Java 9和更高版本开始,Java Streams工具使这一点变得有趣。有趣,但可能不是最好的方法。
我们使用code points而不是char
值。 char
类型是旧的,并且限制为a subset of个所有可能的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()
;
如果多余的字符被截断,请用ellipsis替换最后一个字符。
if ( input.length () > limit )
{
output = output.substring ( 0 , output.length () - 1 ) + "…";
}
如果我能想到一种将流线与“如果超出限制,则省略号”部分放在一起的方法。
答案 8 :(得分:0)
str==null ? str : str.substring(0, Math.min(str.length(), 10))
,或者
str==null ? "" : str.substring(0, Math.min(str.length(), 10))
使用null。
答案 9 :(得分:0)
这是Kotlin解决方案
一行,
if (yourString?.length!! >= 10) yourString?.take(90).plus("...") else yourString
传统
if (yourString?.length!! >= 10) {
yourString?.take(10).plus("...")
} else {
yourString
}
答案 10 :(得分:0)
//这是通过..缩短字符串长度的方法。 //在您的课程中添加以下方法
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kubernetes-dashboard-ingress
namespace: kubernetes-dashboard
annotations:
haproxy.org/server-ssl: "true"
spec:
tls:
- hosts:
- "dashboard.my.example.com"
secretName: kubernetes-dashboard-secret
rules:
- host: "dashboard.my.example.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kubernetes-dashboard
port:
number: 443