Тем, кто проголосовал против: ваше поведение снисходительно. Этот вопрос подробный и конкретный, написан ясно и просто, он интересен как минимум еще одному программисту. Люди могут не знать, где искать javadoc или исходный код. Наша работа - помогать им, а не ругать их за невежество.
glmxndr
14
@subtenante, ты прав. Я даже раньше защищал людей, которые задают вопросы о Google. Тем не менее, что-то столь же простое, как это, должно быть проверено самостоятельно, и ИМО НИКОГДА не должно гарантировать размещение вопроса на сайте вопросов и ответов. Название вводит в заблуждение, а Q - пустая трата времени для всех, кто его читает.
Крис
9
@Chris: oneat дал мне возможность взглянуть на исходный код. Я много узнал о trim (). Я бы иначе не стал. Каждый сам несет ответственность за свое время. Онеат не виноват в том, что мы не смогли извлечь выгоду из его, казалось бы, наивного вопроса.
glmxndr
1
@skaffman: (c) должно быть «попробуй и увидишь», и только потом (d) спроси на SO.
Mac
2
Этот вопрос кажется не по теме, потому что он о чем-то, что каждый сможет найти в руководстве И протестировать менее чем за минуту.
Мне пришлось проголосовать против, поскольку этот ответ не охватывает то, что в документации означает «пробел». Казалось бы, логично, что это будет где Chararacter.isWhitespaceправда, но это не то, что подразумевается под "пробелом" ..
user2864740
7
@ user2864740: этот ответ не предназначен для исчерпывающего анализа trimи isWhiteSpaceт. д. или обсуждения двусмысленностей в документации Java; это прямой ответ на конкретный вопрос, заданный выше, т. е. trimудаляет ли метод одно или несколько пробелов?
LukeH
Я знаю, что это не так. Я проголосовал против, потому что это не указывает на это, даже мимоходом. В любом случае, я не могу отменить свой голос, если он не обновлен (хотя бы минимально).
user2864740 02
33
Из исходного кода (декомпилированного):
publicString 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которые вы видите, означают, что все символы, юникод которых находится ниже пробела, в начале и в конце, удаляются.
Попросите нового программиста, который только что научился делать System.out.println, провести модульный тест, чтобы увидеть, каков результат ...
jaxkodex
26
Однако следует отметить, что String.trim имеет своеобразное определение «пробелов». Он не удаляет пробелы Unicode, но также удаляет управляющие символы ASCII, которые вы не можете рассматривать как пробелы.
Этот метод может использоваться для обрезки пробелов в начале и в конце строки; фактически, он также обрезает все управляющие символы ASCII.
Если возможно, вы можете использовать функцию StringUtils.strip () Commons Lang, которая также обрабатывает пробелы Unicode (и также является нулевой).
Похоже на ужасную оплошность со стороны дизайнеров ... и ужасно излишне техническая проработка документации мало помогает.
user2864740
2
Браво! Вы ответили на самый простой вопрос, который когда-либо задавали на StackOverflow, и нашли что-то умное, что можно сказать по этому поводу. Вы - заслуга гонки.
Mark McKenna
3
@MarkMcKenna: Я все время обнаруживаю, что эти якобы сверхпростые вопросы программирования (обрезка строк, поиск расширений имен файлов и т. Д.) Всегда имеют свои скрытые сложности. Это немного разочаровывает в нашем ремесле и инструментах.
Возвращает копию строки без начальных и конечных пробелов.
Удаляются пробелы с обеих сторон:
Обратите внимание, что trim()не меняет экземпляр String, он вернет новый объект:
String original =" content ";String withoutWhitespace = original.trim();// original still refers to " content "// and withoutWhitespace refers to "content"
на самом деле ничто не может изменить экземпляр String (кроме некоторых грязных вещей, которые могут привести к сбою ВМ)
AvrDragon
13
Основываясь на документах Java здесь ,.trim() заменяет '\ u0020', который обычно известен как пробел.
Но обратите внимание, что '\ u00A0' ( Unicode NO-BREAK SPACE ) также рассматривается как пробел, и.trim() НЕ удаляет его. Это особенно часто встречается в HTML.
Основываясь на документации Javadoc, он удаляет начальные и конечные пробелы, включая пробелы, табуляцию, возврат каретки новой строки, подачу формы и т. Д., И исключает символы, которые не являются начальными и конечными.
Marquis of Lorne
Спасибо, это помогает мне распределять
Асад Хайдер
8
Пример trim()удаления пробелов Java :
publicclassTest{publicstaticvoid 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);}}
/**
* 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>'\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>'\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>'\u0020'</code>, and let
* <i>m</i> be the index of the last character in the string whose code
* is greater than <code>'\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>, <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.
*/publicString 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.
String b =" This is a test "System.out.println(b);
Вывод будет This is a test
таким: «Обрезка» удаляет только пробелы перед первым символом и после последнего символа в строке и игнорирует внутренние пробелы. Это часть моего кода, которая немного оптимизирует встроенный Stringметод обрезки, удаляя внутренние пробелы и удаляя пробелы до и после вашего первого и последнего символа в строке. Надеюсь, поможет.
Одна очень важная вещь заключается в том, что строка, состоящая полностью из «пробелов», вернет пустую строку.
если string sSomething = "xxxxx", где xстоит белых пространств, sSomething.trim()возвращает пустую строку.
если a string sSomething = "xxAxx", где xозначает пробелы, sSomething.trim()вернется A.
если sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim()вернется SomethingxxxxAndSomethingxElse, обратите внимание, что количество xпромежутков между словами не изменилось.
Если вы хотите проверить, что будет делать какой-то метод, вы можете использовать BeanShell . Это язык сценариев, максимально приближенный к Java. Вообще говоря, интерпретируется Java с некоторыми смягчениями. Другой вариант такого рода - язык Groovy . Оба этих языка сценариев предоставляют удобный цикл чтения-оценки-печати, знакомый с интерпретируемых языков. Итак, вы можете запустить консоль и просто ввести:
" content ".trim();
Вы увидите "content"результат после нажатия Enter(или Ctrl+Rв консоли Groovy).
Ответы:
Все они .
(Но почему вы просто не попробовали и не убедились?)
источник
Chararacter.isWhitespace
правда, но это не то, что подразумевается под "пробелом" ..trim
иisWhiteSpace
т. д. или обсуждения двусмысленностей в документации Java; это прямой ответ на конкретный вопрос, заданный выше, т. е.trim
удаляет ли метод одно или несколько пробелов?Из исходного кода (декомпилированного):
Два,
while
которые вы видите, означают, что все символы, юникод которых находится ниже пробела, в начале и в конце, удаляются.источник
Если есть сомнения, напишите модульный тест:
NB : конечно, тест (для JUnit + Hamcrest) не терпит неудач
источник
Однако следует отметить, что String.trim имеет своеобразное определение «пробелов». Он не удаляет пробелы Unicode, но также удаляет управляющие символы ASCII, которые вы не можете рассматривать как пробелы.
Если возможно, вы можете использовать функцию StringUtils.strip () Commons Lang, которая также обрабатывает пробелы Unicode (и также является нулевой).
источник
См. API для класса String:
Удаляются пробелы с обеих сторон:
Обратите внимание, что
trim()
не меняет экземпляр String, он вернет новый объект:источник
Основываясь на документах Java здесь ,
.trim()
заменяет '\ u0020', который обычно известен как пробел.Но обратите внимание, что '\ u00A0' ( Unicode NO-BREAK SPACE
) также рассматривается как пробел, и.trim()
НЕ удаляет его. Это особенно часто встречается в HTML.Для его удаления использую:
Пример этой проблемы обсуждались здесь .
источник
Пример
trim()
удаления пробелов Java :ВЫВОД
источник
Из java docs (источник класса String),
Обратите внимание, что после начала и длины он вызывает метод подстроки класса String.
источник
trim()
удалит все начальные и конечные пробелы. Но имейте в виду: ваша строка не изменилась.trim()
вместо этого вернет новый экземпляр строки.источник
Если ваш строковый ввод:
Да, вывод будет «abc»; Но если ваш ввод String:
Вывод будет
This is a test
таким: «Обрезка» удаляет только пробелы перед первым символом и после последнего символа в строке и игнорирует внутренние пробелы. Это часть моего кода, которая немного оптимизирует встроенныйString
метод обрезки, удаляя внутренние пробелы и удаляя пробелы до и после вашего первого и последнего символа в строке. Надеюсь, поможет.источник
.trim()
вSystem.out.println(a);
?Он удалит все пробелы с обеих сторон.
источник
Одна очень важная вещь заключается в том, что строка, состоящая полностью из «пробелов», вернет пустую строку.
если
string sSomething = "xxxxx"
, гдеx
стоит белых пространств,sSomething.trim()
возвращает пустую строку.если a
string sSomething = "xxAxx"
, гдеx
означает пробелы,sSomething.trim()
вернетсяA
.если
sSomething ="xxSomethingxxxxAndSomethingxElsexxx"
,sSomething.trim()
вернетсяSomethingxxxxAndSomethingxElse
, обратите внимание, что количествоx
промежутков между словами не изменилось.Если вы хотите, чтобы аккуратная упакованная строка сочеталась
trim()
с регулярным выражением, как показано в этом сообщении: Как удалить повторяющиеся пробелы в строке с помощью Java? ,Порядок не имеет значения для результата, но
trim()
сначала будет более эффективным. Надеюсь, поможет.источник
Чтобы сохранить только один экземпляр для String, вы можете использовать следующее.
или
Тогда значение
str
String будетstr = "Hello"
источник
Trim () работает с обеих сторон.
источник
В Javadoc for String есть все подробности. Удаляет пробелы (пробелы, табуляции и т. Д.) С обоих концов и возвращает новую строку.
источник
Если вы хотите проверить, что будет делать какой-то метод, вы можете использовать BeanShell . Это язык сценариев, максимально приближенный к Java. Вообще говоря, интерпретируется Java с некоторыми смягчениями. Другой вариант такого рода - язык Groovy . Оба этих языка сценариев предоставляют удобный цикл чтения-оценки-печати, знакомый с интерпретируемых языков. Итак, вы можете запустить консоль и просто ввести:
Вы увидите
"content"
результат после нажатияEnter
(илиCtrl+R
в консоли Groovy).источник
источник
trim()
уже делает то,repkaceAll()
что делал бы, если бы ему было что делать.