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

ysh*_*hak 118 java string

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

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

我怎样才能做到这一点?

Ste*_*n C 234

s = s.substring(0, Math.min(s.length(), 10));
Run Code Online (Sandbox Code Playgroud)

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


笔记:

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

  2. 如果您的String包含BMP之外的Unicode代码点,则行为可能不正确1 ; 例如Emojis.对于适用于所有Unicode代码点的(更复杂的)解决方案,请参阅@ sibnick的解决方案.


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


H6.*_*H6. 116

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..."
Run Code Online (Sandbox Code Playgroud)

  • ...如果您不想要省略号,那么StringUtils.left()可以帮助您. (11认同)
  • @StephenC - 问题显示8个字符后跟2个点,给定长度限制为10,这很像省略号(只有2个点而不是3个点).很可能许多发现这个问题的人会认为省略号是有用的. (7认同)
  • 可能是,但OP的问题不是要求"省略号". (5认同)
  • 仅供参考,[水平省略号](https://en.wikipedia.org/wiki/Ellipsis) 是单个字符,而不是三个[句号](https://en.wikipedia.org/wiki/Full_stop) 字符: …… (2认同)

Mul*_*lki 42

有一个StringUtils功能可以做到这一点.

s = StringUtils.left(s, 10)
Run Code Online (Sandbox Code Playgroud)

如果len字符不可用,或者String为null,则返回String而不会发生异常.如果len为负,则返回空字符串.

StringUtils.left(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


sib*_*ick 18

像往常一样,没有人关心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)));
    }
}
Run Code Online (Sandbox Code Playgroud)


shi*_*t66 10

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

  • substring的第二个参数是独占的,因此这个答案将String修剪为9个字符. (16认同)

小智 7

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

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


rek*_*otc 5

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

s = s.substring(Math.max(s.length(),10) - 10);
Run Code Online (Sandbox Code Playgroud)


Leo*_*der 5

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

yourString.take(10)
Run Code Online (Sandbox Code Playgroud)

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

文档


Bas*_*que 5

太长了;博士

\n\n

您似乎要求省略号\xe2\x80\xa6在最后一个地方这是一个用于操作输入字符串的单行代码。

\n\n
String input = "abcdefghijkl";\nString output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "\xe2\x80\xa6" ) : input;\n
Run Code Online (Sandbox Code Playgroud)\n\n

看到这个在 IdeOne.com 上实时运行的代码。

\n\n
\n

abcdefghi\xe2\x80\xa6

\n
\n\n

三元运算符

\n\n

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

\n\n
String input = "abcdefghijkl" ;\n\nString output = \n    ( input.length() > 10 )          // If too long\xe2\x80\xa6\n    ?                                \n    input     \n    .substring( 0 , 10 - 1 )         // Take just the first part, adjusting by 1 to replace that last character with an ellipsis.\n    .concat( "\xe2\x80\xa6" )                   // Add the ellipsis character.\n    :                                // Or, if not too long\xe2\x80\xa6\n    input                            // Just return original string.\n;\n
Run Code Online (Sandbox Code Playgroud)\n\n

看到这个在 IdeOne.com 上实时运行的代码。

\n\n
\n

abcdefghi\xe2\x80\xa6

\n
\n\n

Java 流

\n\n

从 Java 9 及更高版本开始,Java Streams 工具使这变得有趣。有趣,但也许不是最好的方法。

\n\n

我们使用代码点而不是char值。该char类型是遗留类型,并且仅限于所有可能的Unicode 的子集

\n\n
String input = "abcdefghijkl" ;\nint limit = 10 ;\nString output =\n        input\n                .codePoints()\n                .limit( limit )\n                .collect(                                    // Collect the results of processing each code point.\n                        StringBuilder::new,                  // Supplier<R> supplier\n                        StringBuilder::appendCodePoint,      // ObjIntConsumer<R> accumulator\n                        StringBuilder::append                // BiConsumer<R,\xe2\x80\x8bR> combiner\n                )\n                .toString()\n        ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我们截断了多余的字符,请用省略号替换最后一个字符

\n\n
if ( input.length () > limit )\n{\n    output = output.substring ( 0 , output.length () - 1 ) + "\xe2\x80\xa6";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我能想出一种方法将流线与“如果超过限制,则省略”部分放在一起就好了。

\n