Подтвердить что ты не робот

Какая хорошая альтернатива LTRIM и RTRIM в Java?

Что является хорошей альтернативой JavaScript ltrim() и rtrim() функций в Java?

4b9b3361

Ответ 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 не так уж и хорош, но сработает.