java 中 rtrim 与 StringBuilder 的等价物

Equivalent of rtrim with StringBuilder in java

我正在尝试从右侧 trim StringBuilder,像这样:

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

上述函数可以很好地处理 trimStr 字符,但我想将 trimStr 作为字符串传递。是否有相同的库(类似于 StringUtils)?

您可以像这样使用 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"

向左 trim (lTrim)

对于左侧 trim,您可以将正则表达式更改为 str.toString().replaceFirst("^(" + Pattern.quote(trimStr) + ")+", "")

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

另一个没有正则表达式的解决方案

右 trim (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;
}

向左 trim (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;
}

类似这样的方法可行:

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;
}

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

如果您想删除 str 末尾出现的所有 trimStr,您可以这样做:

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;
}

如您所述,您可以使用 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));
}