Сколько пробелов будет удалено Java String.trim()?

В Java у меня есть такая строка:

"     content     ".

Будет ли String.trim() удалять все пробелы на этих сторонах или всего одно место на каждом?

Ответ 1

Все из них.

Возвращает: Копия этой строки с удалением ведущего и заднего пробелов удалена или эта строка, если у нее нет начального или конечного пробела.

~ Цитируется из Java 1.5.0 docs

(Но почему ты просто не попробовал это и не увидел сам?)

Ответ 2

Из исходного кода (декомпилированный):

  public String trim()
  {
    int i = this.count;
    int j = 0;
    int k = this.offset;
    char[] arrayOfChar = this.value;
    while ((j < i) && (arrayOfChar[(k + j)] <= ' '))
      ++j;
    while ((j < i) && (arrayOfChar[(k + i - 1)] <= ' '))
      --i;
    return (((j > 0) || (i < this.count)) ? substring(j, i) : this);
  }

Два while, которые вы можете видеть, означают, что все символы, юникод которых находится ниже символа пробела, в начале и конце, удаляются.

Ответ 3

В случае сомнений напишите unit test:

@Test
public void trimRemoveAllBlanks(){
    assertThat("    content   ".trim(), is("content"));
}

NB: конечно тест (для JUnit + Hamcrest) не терпит неудачу

Ответ 4

Одно дело отметить, однако, что String.trim имеет своеобразное определение "пробелы". Он не удаляет пробелы Unicode, но также удаляет управляющие символы ASCII, которые вы не можете рассматривать как пробельные символы.

Этот метод может использоваться для обрезания пробелов от начала и до конца строки; Фактически, он также обрезает все управляющие символы ASCII.

Если возможно, вы можете использовать Commons Lang StringUtils.strip(), который также обрабатывает пробельные символы Unicode (и также является нулевым).

Ответ 5

См. API для класса String:

Возвращает копию строки с опущенными пробелами в начале и конце.

Пробелы с обеих сторон удаляются:

Обратите внимание, что trim() не изменяет экземпляр String, он вернет новый объект:

 String original = "  content  ";
 String withoutWhitespace = original.trim();

 // original still refers to "  content  "
 // and withoutWhitespace refers to "content"

Ответ 6

На основе Java docs здесь, .trim() заменяет '\ u0020', который обычно называется пробелом.

Но учтите, что '\ u00A0' (Unicode NO-BREAK SPACE &nbsp;) также рассматривается как пробел и .trim() НЕ удалит это. Это особенно характерно для HTML.

Чтобы удалить его, я использую:

tmpTrimStr = tmpTrimStr.replaceAll("\\u00A0", "");

Пример этой проблемы обсуждался здесь.

Ответ 7

Пример Java trim() удаление пробелов:

public class Test
{
    public static void main(String[] args)
    {
        String str = "\n\t This is be trimmed.\n\n";

        String newStr = str.trim();     //removes newlines, tabs and spaces.

        System.out.println("old = " + str);
        System.out.println("new = " + newStr);
    }
}

ВЫХОД

old = 
 This is a String.


new = This is a String.

Ответ 8

Из java docs (источник класса String),

/**
 * Returns a copy of the string, with leading and trailing whitespace
 * omitted.
 * <p>
 * If this <code>String</code> object represents an empty character
 * sequence, or the first and last characters of character sequence
 * represented by this <code>String</code> object both have codes
 * greater than <code>'&#92;u0020'</code> (the space character), then a
 * reference to this <code>String</code> object is returned.
 * <p>
 * Otherwise, if there is no character with a code greater than
 * <code>'&#92;u0020'</code> in the string, then a new
 * <code>String</code> object representing an empty string is created
 * and returned.
 * <p>
 * Otherwise, let <i>k</i> be the index of the first character in the
 * string whose code is greater than <code>'&#92;u0020'</code>, and let
 * <i>m</i> be the index of the last character in the string whose code
 * is greater than <code>'&#92;u0020'</code>. A new <code>String</code>
 * object is created, representing the substring of this string that
 * begins with the character at index <i>k</i> and ends with the
 * character at index <i>m</i>-that is, the result of
 * <code>this.substring(<i>k</i>,&nbsp;<i>m</i>+1)</code>.
 * <p>
 * This method may be used to trim whitespace (as defined above) from
 * the beginning and end of a string.
 *
 * @return  A copy of this string with leading and trailing white
 *          space removed, or this string if it has no leading or
 *          trailing white space.
 */
public String trim() {
int len = count;
int st = 0;
int off = offset;      /* avoid getfield opcode */
char[] val = value;    /* avoid getfield opcode */

while ((st < len) && (val[off + st] <= ' ')) {
    st++;
}
while ((st < len) && (val[off + len - 1] <= ' ')) {
    len--;
}
return ((st > 0) || (len < count)) ? substring(st, len) : this;
}

Обратите внимание, что после получения начала и длины он вызывает метод подстроки класса String.

Ответ 9

trim() удалит все ведущие и завершающие пробелы. Но имейте в виду: ваша строка не изменяется. trim() вместо этого вернет новый экземпляр строки.

Ответ 10

Если ваш ввод строки:

String a = "   abc   ";
System.out.println(a);

Да, выход будет "abc"; Но если ваш строковый вход:

String b = "    This  is  a  test  "
System.out.println(b);

Выход будет This is a test Таким образом, обрезка только удаляет пробелы перед первым символом и после последнего символа в строке и игнорирует внутренние пространства. Это часть моего кода, которая немного оптимизирует встроенный метод String trim, удаляя внутренние пространства и удаляя пробелы до и после вашего первого и последнего символов в строке. Надеюсь, что это поможет.

public static String trim(char [] input){
    char [] output = new char [input.length];
    int j=0;
    int jj=0;
    if(input[0] == ' ' )    {
        while(input[jj] == ' ') 
            jj++;       
    }
    for(int i=jj; i<input.length; i++){
      if(input[i] !=' ' || ( i==(input.length-1) && input[input.length-1] == ' ')){
        output[j]=input[i];
        j++;
      }
      else if (input[i+1]!=' '){
        output[j]=' ';
        j++;
      }      
    }
    char [] m = new char [j];
    int a=0;
    for(int i=0; i<m.length; i++){
      m[i]=output[a];
      a++;
    }
    return new String (m);
  }

Ответ 11

Он удалит все пробелы на обеих сторонах.

Ответ 12

Очень важно то, что строка, полностью состоящая из "белых пробелов", вернет пустую строку.

если a string sSomething = "xxxxx", где x обозначает белые пробелы, sSomething.trim() вернет пустую строку.

если a string sSomething = "xxAxx", где x означают пробелы, sSomething.trim() вернет A.

if sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim() вернет SomethingxxxxAndSomethingxElse, заметьте, что число x между словами не изменяется.

Если вы хотите, чтобы аккуратная пакетированная строка объединяла trim() с регулярным выражением, как показано в этом сообщении: Как удалить повторяющиеся пробелы в строке с помощью Java?.

Заказ не имеет смысла для результата, но trim() сначала будет более эффективным. Надеюсь, что это поможет.

Ответ 13

Чтобы сохранить только один экземпляр для String, вы можете использовать следующее.

str = "  Hello   ";

или

str = str.trim();

Тогда значение str String будет str = "Hello"

Ответ 14

Trim() работает для обеих сторон.

Ответ 15

Javadoc для String содержит все подробности. Удаляет пустое пространство (пробел, вкладки и т.д.) С обоих концов и возвращает новую строку.

Ответ 16

Если вы хотите проверить, что будет делать какой-то метод, вы можете использовать BeanShell. Это язык сценариев, предназначенный как можно ближе к Java. Вообще говоря, это интерпретация Java с некоторыми релаксациями. Другим вариантом такого рода является Groovy. Оба этих языка сценариев обеспечивают удобное чтение цикла Read-Eval-Print из интерпретируемых языков. Таким образом, вы можете запустить консоль и просто ввести:

"     content     ".trim();

Вы увидите "content" в результате после нажатия Enter (или Ctrl+R в консоли Groovy).

Ответ 17

String formattedStr=unformattedStr;
formattedStr=formattedStr.trim().replaceAll("\\s+", " ");