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

时间:2011-12-14 05:03:43

标签: java string

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

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

我怎样才能做到这一点?

11 个答案:

答案 0 :(得分:205)

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

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


注意:

  1. 上面做了真正的修剪。如果你真的想在截断时用点替换最后三个(!)字符,那么使用Apache Commons StringUtils.abbreviate

  2. 如果您的String包含BMP之外的Unicode代码点,则此行为可能会错误 1 ;例如表情符号。对于适用于所有Unicode代码点的(更复杂的)解决方案,请参阅@ sibnick的solution


  3. 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"

StringUtils.Left JavaDocs

礼貌: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)

使用Kotlin,它很简单:

yourString.take(10)
  

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

Documentation

答案 7 :(得分:1)

tl; dr

截断时,您似乎在要求最后一个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流

从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