Funkcja trim()
powoduje usunięcie zarówno spacji końcowej, jak i początkowej, ale jeśli chcę tylko usunąć spację ciągową, jak mogę to zrobić?Jak usunąć tylko końcowe spacje ciągu znaków w Javie i zachować wiodące spacje?
Dzięki!
Funkcja trim()
powoduje usunięcie zarówno spacji końcowej, jak i początkowej, ale jeśli chcę tylko usunąć spację ciągową, jak mogę to zrobić?Jak usunąć tylko końcowe spacje ciągu znaków w Javie i zachować wiodące spacje?
Dzięki!
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
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
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
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|
Co masz na myśli mówiąc o "odwrocie" tego, czego chciał? – Ahmad
@Ahmad powiedział, co jeśli chcę tylko usunąć * spacje końcowe *. – ChiefTwoPencils
Ohh. Przepraszam, że błędnie przeczytałem pytanie. Dziękuję za wskazanie. +1 – Ahmad
Inną opcją jest użycie Apache Commons StringUtils
konkretnie StringUtils.stripEnd
String stripped = StringUtils.stripEnd(" my lousy string "," ");
Przepraszam, jestem na Androidzie, więc nie mogłem z niego korzystać – kzjfr0
Zgadzam się. Powinieneś jednak wskazać na twoje pytania słowem "android", ponieważ "android" to nie 'Java'. –
@TimBender To moja wina, usunąłem tag Androida, ponieważ pytanie wydawało mi się generyczną Javą. Przepraszam. –
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 "".
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.
Wartość ciągu = "Witamy w java";
Możemy użyć:
wartość = wartość.trim();
OP prosi o usunięcie jedynie spacji końcowych. – Matt
Wiosenny framework daje użyteczne narzędzie org.springframework.util.StringUtils.
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);
}
@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. –
Nie działa dla mnie w java7 – kaspersky
Dlaczego '+' byłby potrzebny, jeśli '\ s' usuwa wszelkie białe znaki? – EGHDK