代码之家  ›  专栏  ›  技术社区  ›  learner

java中rtrim与stringbuilder的等价性

  •  1
  • learner  · 技术社区  · 7 年前

    我在试着修剪 StringBuilder 从右边看,像这样:

    private StringBuilder rtrim(StringBuilder str, Character trimStr) {
        if (str.charAt(str.length() - 1) == trimStr) {
            return str.deleteCharAt(str.length() - 1);
        }
        return str;
    }
    

    上面的函数可以将character作为trimstr使用,但是我想将trimstr作为string传递。是否有相同的库(类似于stringutils)?

    3 回复  |  直到 7 年前
        1
  •  4
  •   Youcef LAIDANI    7 年前

    您可以对regex使用replaceAll或仅使用replaceFirst,如下所示:

    String str = "  some string  ";
    str = str.replaceAll("\\s*$", "");//output is "  some string"
    

    编辑

    如果使用的是StringBuilder,则可以使用:

    private static StringBuilder rtrim(StringBuilder str, String trimStr) {
        return new StringBuilder(
                str.toString().replaceFirst("(" + Pattern.quote(trimStr) + ")+$", "")
        );
    }
    

    一些输入和输出

    "  some string   "    + " "    ==> "  some string"
    "  some stringaaa"    + "a"    ==> "  some string"
    "  some stringabab"   + "ab"   ==> "  some string"
    

    左饰板(LTRIM)

    对于左修剪你可以改变你的正则表达式为 str.toString().replaceFirst("^(" + Pattern.quote(trimStr) + ")+", "")

    private static StringBuilder rtrim(StringBuilder str, String trimStr) {
        return new StringBuilder(
                str.toString().replaceFirst("^(" + Pattern.quote(trimStr) + ")+", "")
        );
    }
    

    另一个没有regex的解决方案

    右饰板(RTRIM)

    public StringBuilder rTrim(StringBuilder str, String trimStr) {
        if (str != null && trimStr != null) {
            int trimLen = trimStr.length();
            int strLen = str.length();
            if (strLen != 0 && trimLen != 0) {
                while (strLen != 0 && str.substring(strLen - trimLen, strLen).equals(trimStr)) {
                    str = str.delete(strLen - trimLen, strLen);
                    strLen = str.length();
                }
            }
        }
        return str;
    }
    

    左饰板(LTRIM)

    public StringBuilder lTrim(StringBuilder str, String trimStr) {
        if (str != null && trimStr != null) {
            int len = trimStr.length();
            if (str.length() != 0 && len != 0) {
                while (str.length() != 0 && str.substring(0, len).equals(trimStr)) {
                    str = str.delete(0, len);
                }
            }
        }
        return str;
    }
    
        2
  •  0
  •   Madushan Perera    7 年前

    正如您所提到的,您可以使用apache StringUtils 图书馆:

    private static StringBuilder rTrim(StringBuilder sb, String stripChars) {
        return new StringBuilder(StringUtils.stripEnd(sb.toString(), stripChars));
    }
    
    private static StringBuilder lTrim(StringBuilder sb, String stripChars) {
        return new StringBuilder(StringUtils.stripStart(sb.toString(), stripChars));
    }
    
        3
  •  0
  •   Riiverside    7 年前

    像这样的事情可以奏效:

    private StringBuilder rtrim(StringBuilder str, String trimStr) {
        if(str.length() == 0 || trimStr.isEmpty()) {
            return str;
        }
        int lastIndexOf = str.lastIndexOf(trimStr);
    
        if(lastIndexOf >= 0 && lastIndexOf + trimStr.length() == str.length()) {
            str.setLength(lastIndexOf);
        }
        return str;
    }
    

    这将删除 trimStr 从提供的 str . 使用 lastIndexOf 直接在 StringBuilder 避免将所有内容转换为字符串。

    如果要删除 特里姆斯特尔 结束时 str公司 你可以这样做:

    private StringBuilder rtrim(StringBuilder str, String trimStr) {
        if(str.length() == 0 || trimStr.isEmpty()) {
            return str;
        }
        int lastIndexOf;
        while((lastIndexOf = str.lastIndexOf(trimStr)) >= 0 && lastIndexOf + trimStr.length() == str.length()) {
            str.setLength(lastIndexOf);
        }
        return str;
    }