2013-06-07 13 views

Odpowiedz

50

Używając wyrażenia regularnego \s++$, możesz zamienić wszystkie znaki spacji spoza linii (zawierające znaki spacji i tabulatorów) bez żadnych znaków ("").

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

Wyjście

foo 

Online demo.

Oto podział regex:

  • \s – każdy biały znak,
  • ++ – dopasować jeden lub więcej z poprzedniego tokena (łącznie); tj. dopasować jedną lub więcej znaków białych znaków. Wzorzec + jest używany w jego possessive form++, co zajmuje mniej czasu, aby wykryć przypadek, gdy wzór nie pasuje.
  • $ – koniec łańcucha.

W ten sposób wyrażenie regularne dopasuje tyle odstępów, ile może nastąpić bezpośrednio za końcem łańcucha znaków: innymi słowy, końcowe białe znaki.

Inwestycja w naukę wyrażeń regularnych stanie się bardziej wartościowa, jeśli będziesz musiał później rozszerzyć swoje wymagania.

Odniesienia

+8

@WChargin Dziękujemy za podanie podziału wyrażenia regularnego. Myślę, że więcej osób powinno podążać za przykładem i poprawiać odpowiedzi. –

+2

Nie działa dla mnie w java7 – kaspersky

+1

Dlaczego '+' byłby potrzebny, jeśli '\ s' usuwa wszelkie białe znaki? – EGHDK

9

I zmodyfikowane oryginalny java.lang.String.trim() SPOSÓB kawałek i powinny działać:

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

testu:

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"); 

wyjściowa:

 Hello World // No trailing spaces left 
3

Odpowiedź najbardziej praktyczny jest @ Micha'S, Ahmad jest odwrotnością tego, co chciałeś tak ale oto co wymyśliłem w przypadku wolisz nie używać narzędzi nieznanych lub zobaczyć konkretne podejście.

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

używany jak:

public static void main(String[] args) { 

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

wyjściowa:

Some text here | 
Some text here| 
+1

Co masz na myśli mówiąc o "odwrocie" tego, czego chciał? – Ahmad

+1

@Ahmad powiedział, co jeśli chcę tylko usunąć * spacje końcowe *. – ChiefTwoPencils

+1

Ohh. Przepraszam, że błędnie przeczytałem pytanie. Dziękuję za wskazanie. +1 – Ahmad

10

Inną opcją jest użycie Apache Commons StringUtils konkretnie StringUtils.stripEnd

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

Przepraszam, jestem na Androidzie, więc nie mogłem z niego korzystać – kzjfr0

+2

Zgadzam się. Powinieneś jednak wskazać na twoje pytania słowem "android", ponieważ "android" to nie 'Java'. –

+1

@TimBender To moja wina, usunąłem tag Androida, ponieważ pytanie wydawało mi się generyczną Javą. Przepraszam. –

1

Najlepszym sposobem moim zdaniem:

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

nie przeznaczyć dowolną tymczasowy obiekt, aby wykonać zadanie i to szybciej niż za pomocą wyrażenia regularnego. Usuwa również wszystkie spacje, a nie tylko "".

1

Oto bardzo krótki, skuteczny i łatwy w wersji do czytania:

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

Jako alternatywę dla str.charAt(i) != ' ' można również wykorzystać !Character.isWhitespace(str.charAt(i) jeśli chcesz korzystać z szerszą definicję spacji.

0

Wartość ciągu = "Witamy w java";

Możemy użyć:

wartość = wartość.trim();

+1

OP prosi o usunięcie jedynie spacji końcowych. – Matt

0

Ten kod ma być łatwo, jak to możliwe odczytać za pomocą nazw opisowych (i unikanie wyrażeń regularnych).

Używa Java Optional Java 8, więc nie jest odpowiedni dla wszystkich.

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); 
} 
Powiązane problemy