Эквивалент rtrim с StringBuilder в Java - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь обрезать 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)?

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

Примерно так может работать:

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 позволяет избежать преобразования всего в строку.

Если вы хотите удалить все вхождения trimStr в конце 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;
}
0 голосов
/ 23 июня 2018

Как вы уже упоминали, вы можете использовать библиотеку 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));
}
0 голосов
/ 23 июня 2018

Вы можете использовать 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) + ")+", "")
    );
}

Другое решение без регулярных выражений

правая обрезка (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;
}
...