2013-06-07 9 views

ответ

50

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

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

Выход

foo 

Online demo.

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

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

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

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

Ссылки

+8

@WChargin Благодарим за предоставление регулярного выражения. Я думаю, что больше людей должны следовать за вашим руководством и улучшать ответы. –

+2

Не работает для меня в java7 – kaspersky

+1

Зачем нужно '+', если '\ s' удаляет любые пробелы? – EGHDK

9

Я изменил первоначальный 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 
3

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

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| 
+1

Что значит «реверс» того, что он хотел? – Ahmad

+1

@ Амад сказал, что, если я хочу только удалить * задние * пробелы. – ChiefTwoPencils

+1

Ох. Извините, но я неправильно понял вопрос. Спасибо, что указали это. +1 – Ahmad

10

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

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

извините, я нахожусь на android, поэтому я не мог использовать его – kzjfr0

+2

Согласен. Тем не менее, вы должны сделать так, чтобы пометить ваши вопросы с помощью 'android', поскольку' android' не является 'Java'. –

+1

@TimBender Это моя ошибка, я удалил тег android, так как вопрос казался мне общей Java. Я прошу прощения. –

1

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

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

Это не выделяет временный объект, чтобы сделать работу и быстрее, чем с помощью регулярного выражения. Также он удаляет все пробелы, а не только «».

1

Вот очень короткая, эффективная и простая для чтения версии:

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) если вы хотите использовать более широкое определение пробелов.

0

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

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

значение = value.trim();

+1

OP запрашивает удаление только пробелов. – Matt

0

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

Он использует Java 8's 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); 
} 
Смежные вопросы