Удаление пробелов в конце строки в java

Возможный дубликат:
Strip Leading-and-Trailing-spaces-from-java-string">Strip Leading и Пробелы в конце строки Java

Когда я импортирую данные в приложение, мне нужно избавиться от пробелов в конце определенных строк, но не в начале, поэтому я не могу использовать trim()... Я настроил метод:

public static String quitarEspaciosFinal(String cadena) {
    String[] trozos = cadena.split(" ");
    String ultimoTrozo = trozos[trozos.length-1];
    return cadena.substring(0,cadena.lastIndexOf(ultimoTrozo.charAt(ultimoTrozo.length()-1))+1);
    }

где cadena - это строка, которую я должен преобразовать...

Итак, если cadena = "1234", этот метод вернет "1234"...

Я хотел бы знать, есть ли более эффективный способ сделать это...


person diminuta    schedule 24.08.2012    source источник
comment
Строка состоит из одного слова или может быть предложением?   -  person oopsi    schedule 24.08.2012
comment
@oopsi: на самом деле не имеет значения ^^   -  person m0skit0    schedule 24.08.2012


Ответы (4)


Вы можете использовать метод replaceAll() для строки с регулярным выражением \s+$ :

return cadena.replaceAll("\\s+$", "");

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

person kgautron    schedule 24.08.2012
comment
Я бы не использовал *, но +. Бесполезно заменять 0 пробелов;) - person m0skit0; 24.08.2012
comment
replaceFirst здесь тоже подойдет. - person Marko Topolnik; 24.08.2012
comment
@MarkoTopolnik: replaceFirst()? Это replaceLast() чего хочет OP. - person m0skit0; 27.08.2012
comment
@ m0skit0 m0skit0 Это регулярное выражение, очевидно, может иметь только одно совпадение. replaceLast это даже не метод String. - person Marko Topolnik; 27.08.2012
comment
Я знаю, что его не существует, это была шутка. В любом случае, дело в том, что replaceFirst() здесь бесполезен. - person m0skit0; 27.08.2012

Библиотека Apache Commons имеет соответствующий метод stripEnd.

person halex    schedule 24.08.2012
comment
вторая ссылка уже не работает - person Nactus; 19.09.2015

Я бы сделал это так:

public static String trimEnd(String s)
{
    if ( s == null || s.length() == 0 )
        return s;
    int i = s.length();
    while ( i > 0 &&  Character.isWhitespace(s.charAt(i - 1)) )
        i--;
    if ( i == s.length() )
        return s;
    else
        return s.substring(0, i);
}

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

person Nicola Musatti    schedule 24.08.2012
comment
Могу я узнать причину минуса? - person Nicola Musatti; 27.08.2012
comment
Я бы не был так уверен в эффективности (регулярные выражения могут быть закодированы в собственном коде). И на самом деле бесполезно изобретать велосипед. Зачем кодировать что-то вручную, что уже можно сделать с помощью библиотек? Изобретать велосипед можно только в том случае, если то, что есть в наличии, вас не устраивает (или слишком медленно). Оптимизируй позже;) И я фактически удалил отрицательный голос: P - person m0skit0; 27.08.2012
comment
Очевидно, что единственный способ убедиться в эффективности — это протестировать на осмысленном наборе данных. Тем не менее, регулярное выражение, скорее всего, окупится за его универсальность: например, механизмы регулярных выражений обычно переводят входные выражения для повышения эффективности, а это шаг, который моя версия не должна выполнять. Что касается внешних библиотек, я склонен с вами согласиться, но это все же компромисс между поддержкой небольшого фрагмента кода и отслеживанием еще одной зависимости. Да ведь иногда проще кодить и отлаживать что-то самому, чем искать готовое решение! - person Nicola Musatti; 27.08.2012
comment
Но вы теряете время, написав это и протестировав. Я хочу сказать, что вам не нужно изобретать велосипед, если в этом нет необходимости. - person m0skit0; 27.08.2012

person    schedule
comment
@ m0skit0 :) Сначала был +, потом редактирую *, понятия не имею почему :). спасибо, хотя - person Eugene; 24.08.2012