Как удалить только пробелы строки в Java и сохранить ведущие пробелы?

Функция trim() удаляет как конечный, так и начальный пробел, однако, если я хочу удалить только завершающий пробел строки, как я могу это сделать?

Ответ 1

Используя регулярное выражение \s++$, вы можете заменить все символы завершающего пробела (включая символы пробела и табуляции) пустой строкой ("").

final String text = "  foo   ";
System.out.println(text.replaceFirst("\\s++$", ""));

Выход

  foo

Демо онлайн.

Вот разбивка регулярного выражения:

  • \s - любой символ пробела,
  • ++ - соответствует одному или нескольким предыдущим токенам (притяжательно); то есть совпадать с одним или несколькими пробельными символами. Шаблон + используется в своей притяжательной форме ++, что занимает меньше времени, чтобы обнаружить случай, когда шаблон не совпадает.
  • $ - конец строки.

Таким образом, регулярное выражение будет соответствовать как можно большему количеству пробелов, за которым непосредственно следует конец строки: другими словами, завершающий пробел.

Инвестиции в изучение регулярных выражений станут более ценными, если позже вам потребуется расширить свои требования.

Рекомендации

Ответ 2

Другой вариант - использовать Apache Commons StringUtils, в частности StringUtils.stripEnd

String stripped = StringUtils.stripEnd("   my lousy string    "," ");

Ответ 3

Я немного изменил оригинальный метод java.lang.String.trim(), и он должен работать:

  public String trim(String str) {
        int len = str.length();
        int st = 0;

        char[] val = str.toCharArray();

        while ((st < len) && (val[len - 1] <= ' ')) {
            len--;
        }
        return str.substring(st, len);
    }

Тест:

  Test test = new Test();
  String sample = "            Hello World               "; // A String with trailing and leading spaces
  System.out.println(test.trim(sample) + " // No trailing spaces left");

Вывод:

        Hello World // No trailing spaces left

Ответ 4

Самый практичный ответ - это @Micha's, Ахмад обратный тому, что вы хотели, чтобы, но вот что я придумал, если вы предпочтете не использовать незнакомые инструменты или не увидеть конкретный подход.

public String trimEnd( String myString ) {

    for ( int i = myString.length() - 1; i >= 0; --i ) {
        if ( myString.charAt(i) == ' ' ) {
            continue;
        } else {
            myString = myString.substring( 0, ( i + 1 ) );
            break;
        }
    }
    return myString;
}

Используется как:

public static void main( String[] args ) {

    String s = "    Some text here   ";
    System.out.println( s + "|" );
    s = trimEnd( s );
    System.out.println( s + "|" );
}

Вывод:

Some text here   |
Some text here|

Ответ 5

Лучший способ на мой взгляд:

public static String trimEnd(String source) {
    int pos = source.length() - 1;
    while ((pos >= 0) && Character.isWhitespace(source.charAt(pos))) {
        pos--;
    }
    pos++;
    return (pos < source.length()) ? source.substring(0, pos) : source;
}

Это не выделяет никакого временного объекта для выполнения задания и работает быстрее, чем использование регулярного выражения. Также он удаляет все пробелы, а не только "".

Ответ 6

Здесь очень короткая, эффективная и удобная для чтения версия:

public static String trimTrailing(String str) {
    if (str != null) {
        for (int i = str.length() - 1; i >= 0; --i) {
            if (str.charAt(i) != ' ') {
                return str.substring(0, i + 1);
            }
        }
    }
    return str;
}

В качестве альтернативы str.charAt(i) != ' ' вы также можете использовать !Character.isWhitespace(str.charAt(i), если хотите использовать более широкое определение пробелов.

Ответ 7

Значение строки = "Добро пожаловать в java";

Таким образом, мы можем использовать

value = value.trim();

Ответ 8

Spring framework дает полезный файл org.springframework.util.StringUtils.

trimTrailingWhitespace

Ответ 9

Этот код предназначен для чтения как можно проще, используя описательные имена (и избегая регулярных выражений).

Он использует Java 8 Optional, поэтому не подходит для всех.

public static String removeTrailingWhitspace(String string) {
    while (hasWhitespaceLastCharacter(string)) {
        string = removeLastCharacter(string);
    }
    return string;
}

private static boolean hasWhitespaceLastCharacter(String string) {
    return getLastCharacter(string)
            .map(Character::isWhitespace)
            .orElse(false);
}

private static Optional<Character> getLastCharacter(String string) {
    if (string.isEmpty()) {
        return Optional.empty();
    }
    return Optional.of(string.charAt(string.length() - 1));
}

private static String removeLastCharacter(String string) {
    if (string.isEmpty()) {
        throw new IllegalArgumentException("String must not be empty");
    }
    return string.substring(0, string.length() - 1);
}

Ответ 10

С JDK11 вы можете использовать stripTrailing:

String result = str.stripTrailing();