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


в Java, у меня есть строка, как это:

"     content     ".

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

17 119

17 ответов:

все они.

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

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

(но почему бы тебе просто не попробовать и не посмотреть самому?)

из исходного кода (декомпиляция) :

  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 то, что вы можете видеть, означает, что все символы, unicode которых находится ниже символа пробела, в начале и конце, удаляются.

Если вы сомневаетесь, напишите модульный тест:

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

NB: конечно тест (для JUnit + Hamcrest) не не

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

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

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

посмотреть API для класса String:

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

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

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

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

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

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

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

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

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

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

пример 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.

из java docs (String class source),

/**
 * 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;
}

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

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

если ваш строковый вход:

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

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

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

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

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);
  }

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

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

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

если a string sSomething = "xxAxx", где x подставка для пробелов, sSomething.trim() вернутся A.

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

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

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

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

str = "  Hello   ";

или

str = str.trim();

значение str строку, будет str = "Hello"

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

документация для строки есть все детали. Удаляет пробелы (пробелы, вкладки и т. д. ) с обоих концов и возвращает новую строку.

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

"     content     ".trim();

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

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