Что является хорошей альтернативой JavaScript ltrim()
и rtrim()
функций в Java?
Какая хорошая альтернатива LTRIM и RTRIM в Java?
Ответ 1
С помощью регулярного выражения вы можете написать:
String s = ...
String ltrim = s.replaceAll("^\\s+","");
String rtrim = s.replaceAll("\\s+$","");
Если вам нужно делать это часто, вы можете создать и скомпилировать шаблон для повышения производительности:
private final static Pattern LTRIM = Pattern.compile("^\\s+");
public static String ltrim(String s) {
return LTRIM.matcher(s).replaceAll("");
}
С точки зрения производительности быстрый микро-тест показывает (после компиляции JIT), что подход регулярного выражения примерно в 5 раз медленнее, чем цикл (0,49 с против 0,11 для 1 млн. ltrim).
Я лично считаю, что подход с регулярным выражением более читабельный и менее подвержен ошибкам, но если производительность является проблемой, вы должны использовать решение цикла.
Ответ 2
Использование regex может быть приятным, но оно довольно медленнее, чем простые функции обрезки:
public static String ltrim(String s) {
int i = 0;
while (i < s.length() && Character.isWhitespace(s.charAt(i))) {
i++;
}
return s.substring(i);
}
public static String rtrim(String s) {
int i = s.length()-1;
while (i >= 0 && Character.isWhitespace(s.charAt(i))) {
i--;
}
return s.substring(0,i+1);
}
Источник: http://www.fromdev.com/2009/07/playing-with-java-string-trim-basics.html
Кроме того, есть некоторые библиотеки, предоставляющие такие функции. Например, Spring StringUtils. Apache Commons StringUtils также предоставляет аналогичные функции: strip, stripStart, stripEnd
StringUtils.stripEnd("abc ", null) = "abc"
Ответ 3
import org.apache.commons.lang3.StringUtils;
private String rTrim(String str) {
return StringUtils.stripEnd(str, /*stripChars*/" ");
}
private String lTrim(String str) {
return StringUtils.stripStart(str, /*stripChars*/" ");
}
Ответ 4
Guava имеет CharMatcher trimLeadingFrom и trimTrailingFrom
например. CharMatcher.whitespace.trimTrailingFrom(s)
Ответ 5
Основываясь на ответе @bezmax, я посмотрел на Spring StringUtils
, но это не могло оправдать перегрузку для меня переход в структуру Spring. Поэтому я решил создать класс Characters
для легкости строк слева и справа для любого заданного символа (класс). Класс доступен на GitHub.
Characters.valueOf('x').trim( ... )
Characters.valueOf('x').leftTrim( ... )
Characters.valueOf('x').rightTrim( ... )
Если вы хотите обрезать пробелы, существует предопределенный класс символов:
Characters.WHITESPACE.trim( ... )
Characters.WHITESPACE.leftTrim( ... )
Characters.WHITESPACE.rightTrim( ... )
В классе есть и другие виды операций с символами, такие как condense
, replace
или split
.
Ответ 6
Может быть немного дешево, но вы также можете использовать их без какой-либо другой библиотеки:
final var string = " Hello World ";
final var rtrimmed = ("." + string).trim().substring(1);
// => " Hello World"
var ltrimmed = (string + ".").trim();
ltrimmed = ltrimmed.substring(0, ltrimmed.length - 1);
// => "Hello World "
Я признаю, что ltrimmed
не так уж и хорош, но сработает.