当前位置: 首页 > 面试题库 >

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

艾学海
2023-03-14
问题内容

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

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

我该如何实现?


问题答案:

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

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

笔记:

  1. 上面做了真正的修剪。如果您实际上想将截断的最后三个(!)字符替换为点,请使用Apache Commons StringUtils.abbreviate

  2. 如果您的字符串包含BMP之外的Unicode代码点,则此行为可能不正确1。例如表情符号。有关适用于所有Unicode代码点的(更复杂的)解决方案,请参见解决方案。
    像往常一样,没有人关心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)));
    }
}

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



 类似资料:
  • 问题内容: 我喜欢过滤掉字符串长度不等于10的数据。 如果我尝试过滤掉列A或B的字符串长度不等于10的任何行,则尝试这样做。 这工作缓慢,但正在工作。 但是,当A中的数据不是字符串而是数字(有时在read_csv读取输入文件时解释为数字)时,有时会产生错误。 我相信应该有更高效,更优雅的代码来代替。 根据下面的答案和评论,我找到的最简单的解决方案是: 要么 要么 问题答案: 应用于filex.cs

  • 问题内容: 与该方法等效的 JavaScript 是什么: C#仅在字符串的 开头 和 结尾 处修剪所选字符! 问题答案: 一行就足够了: 在功能上:

  • 要求出字符串的长度(字符的个数),我们可以使用length函数。调用这个函数的语法和我们前面看到的有点不同: int length; length = fruit.length(); 对于这种函数调用,我们称之为在字符串变量fruit上**调用(invoke)**length函数。“调用(invoke)”这个词可能看起来有点奇怪,但是后面我们还会遇到很多在对象上调用函数的例子。 函数调用的语法称

  • 问题内容: 如何修剪JavaScript中的字符串? 问题答案: 自IE9 +起,所有浏览器都具有字符串方法。 对于不支持的浏览器,可以使用MDN中的以下polyfill : 也就是说,如果使用,也可以使用,并且可以处理undefined / null。 看到这个:

  • 问题内容: Java字符串修剪不会为我删除空格字符。 输出为。请注意1右边的空间。 我必须从字符串中删除尾随空格,但既不要也不删除它。 无论哪种方式,字符串都保持相同。 编辑:完整代码 :: 为什么我不能删除那个空间? 问题答案: 该网站的源代码显示特殊的html字符。尝试在您的java字符串中搜索或替换以下内容:。 那是一个不可破坏的空间。请参阅:我有一个带有“ \ u00a0”的字符串,我需要

  • 问题内容: 我有一个数据类型为char(20)的db表。我不允许将其更改为varchar。 我正在写一个映射到该表的JPA实体。我希望在我的实体类中表示此列的字符串字段始终包含调整后的值,而不是用数据库中存在的空格填充的20个字符的值。 我看不到任何简单的方法来做到这一点。(注释会震撼!)。此刻,我只是从我的getter()返回一个修整后的值,但这感觉像是一团糟。 谷歌搜索对此没有帮助。有任何想法