Функция trim()
удаляет как конечное, так и ведущее пространство, однако, если я хочу только удалить конечное пространство строки, как я могу это сделать?Как удалить только пробелы строки в Java и сохранить ведущие пробелы?
Спасибо!
Функция trim()
удаляет как конечное, так и ведущее пространство, однако, если я хочу только удалить конечное пространство строки, как я могу это сделать?Как удалить только пробелы строки в Java и сохранить ведущие пробелы?
Спасибо!
Используя регулярное выражение \s++$
, вы можете заменить все символы пробела (включая пробел и символы табуляции) ничем (""
).
final String text = " foo ";
System.out.println(text.replaceFirst("\\s++$", ""));
Выход
foo
Вот разбивка регулярных выражений:
\s
– любой символ пробела,++
– соответствует одному или нескольким предыдущим токенам (по собственному усмотрению); то есть сопоставить один или несколько символов пробелов. Образец +
используется в его possessive form++
, что занимает меньше времени, чтобы обнаружить случай, когда шаблон не совпадает.$
– конец строки.Таким образом, регулярное выражение будет соответствовать столько же пробелов, сколько возможно, за которым следует непосредственно конец строки: другими словами, конечный пробел.
Вложение в учебные регулярные выражения станет более ценным, если вам нужно будет продлить ваши требования позже.
Ссылки
Я изменил первоначальный 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
Самый практичный ответ @ Миха-х,
Ахмад является обратное тому, что вы хотите так
, но вот что я придумал в случае, если вы предпочитаете не использовать незнакомые инструменты или чтобы увидеть конкретный подход.
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|
Что значит «реверс» того, что он хотел? – Ahmad
@ Амад сказал, что, если я хочу только удалить * задние * пробелы. – ChiefTwoPencils
Ох. Извините, но я неправильно понял вопрос. Спасибо, что указали это. +1 – Ahmad
Другим вариантом является использование Apache Commons StringUtils
, в частности StringUtils.stripEnd
String stripped = StringUtils.stripEnd(" my lousy string "," ");
извините, я нахожусь на android, поэтому я не мог использовать его – kzjfr0
Согласен. Тем не менее, вы должны сделать так, чтобы пометить ваши вопросы с помощью 'android', поскольку' android' не является 'Java'. –
@TimBender Это моя ошибка, я удалил тег android, так как вопрос казался мне общей Java. Я прошу прощения. –
Самый лучший способ, на мой взгляд:
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;
}
Это не выделяет временный объект, чтобы сделать работу и быстрее, чем с помощью регулярного выражения. Также он удаляет все пробелы, а не только «».
Вот очень короткая, эффективная и простая для чтения версии:
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)
если вы хотите использовать более широкое определение пробелов.
Строковое значение = "Добро пожаловать в java";
Таким образом, мы можем использовать
значение = value.trim();
OP запрашивает удаление только пробелов. – Matt
Spring framework предоставляет полезную программу org.springframework.util.StringUtils.
Этот код предназначен для читать легко, насколько это возможно, используя описательные имена (и избегать регулярных выражений).
Он использует 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);
}
@WChargin Благодарим за предоставление регулярного выражения. Я думаю, что больше людей должны следовать за вашим руководством и улучшать ответы. –
Не работает для меня в java7 – kaspersky
Зачем нужно '+', если '\ s' удаляет любые пробелы? – EGHDK