Функция trim()
удаляет как конечный, так и начальный пробел, однако, если я хочу удалить только завершающий пробел строки, как я могу это сделать?
Как удалить только пробелы строки в Java и сохранить ведущие пробелы?
Ответ 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.
Ответ 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();