У Java у мене є такий рядок:
" content ".
Чи буде String.trim()
видалено всі пробіли з цих боків або лише один пробіл на кожному?
У Java у мене є такий рядок:
" content ".
Чи буде String.trim()
видалено всі пробіли з цих боків або лише один пробіл на кожному?
Відповіді:
Усі вони .
Повертає : копія цього рядка з вилученим проміжним проміжним білим пробілом або цього рядка, якщо він не має провідного або останнього пробілу.
~ Цитується з Java 1.5.0 документів
(Але чому ти просто не спробував це і переконався?)
Chararacter.isWhitespace
це правда, але це не те, що означає "пробіл" ..
trim
, і isWhiteSpace
т.д., або обговорення неясностей в документації Java; це пряма відповідь на конкретне запитання, задане вище - тобто trim
метод видаляє один простір або кілька пробілів?
З вихідного коду (декомпілюється):
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
які ви можете бачити, означають, що всі символи, унікод яких знаходиться нижче символу пробілу, на початку та в кінці, видаляються.
Якщо ви сумніваєтесь, напишіть одиничний тест:
@Test
public void trimRemoveAllBlanks(){
assertThat(" content ".trim(), is("content"));
}
Примітка : звичайно, тест (для JUnit + Hamcrest) не провалюється
Однак слід зазначити, що String.trim має своєрідне визначення поняття "пробіл". Він не видаляє пробіл Unicode, але також видаляє символи управління ASCII, які ви можете не вважати пробілами.
Цей метод може бути використаний для обрізки пробілів від початку та до кінця рядка; насправді він також обробляє всі символи управління ASCII.
Якщо можливо, ви можете скористатися StringUtils.strip () Commons Lang, який також обробляє пробіл Unicode (і також є безпечним для нуля).
Дивіться клас API для рядка:
Повертає копію рядка з пропущеним пробілом та пробілом.
Пробіл з обох сторін видалено:
Зауважте, що trim()
не змінюється екземпляр String, він поверне новий об'єкт:
String original = " content ";
String withoutWhitespace = original.trim();
// original still refers to " content "
// and withoutWhitespace refers to "content"
Грунтуючись на документах Java тут , .trim()
замінює "\ u0020", який зазвичай називають пробілом.
Але врахуйте, що "\ u00A0" ( Unicode NO-BREAK SPACE
) також розглядається як пробіл, і.trim()
НЕ буде видаляти це. Це особливо часто в HTML.
Щоб видалити його, я використовую:
tmpTrimStr = tmpTrimStr.replaceAll("\\u00A0", "");
Приклад цієї проблеми обговорювався тут .
Приклад trim()
видалення пробілів Java :
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 (джерело класу 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>'\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.
*/
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.
trim()
видалить усі провідні та кінцеві заготовки. Але майте на увазі: ваш рядок не змінено. trim()
поверне замість нього новий екземпляр рядка.
Якщо ваш рядковий вхід:
String a = " abc ";
System.out.println(a);
Так, вихід буде "abc"; Але якщо ваш вхід String:
String b = " This is a test "
System.out.println(b);
Вихід буде таким This is a test
чином обрізка видаляє лише пробіли перед першим символом та після останнього символу в рядку та ігнорує внутрішні пробіли. Це фрагмент мого коду, який трохи оптимізує вбудований 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);
}
.trim()
в System.out.println(a);
?
Одне дуже важливе - це те, що рядок, повністю створений з "білих пробілів", поверне порожню рядок.
якщо a string sSomething = "xxxxx"
, де x
стоїть пробіл, sSomething.trim()
поверне порожню рядок.
якщо a string sSomething = "xxAxx"
, де x
стоять пробіли, sSomething.trim()
повернеться A
.
якщо sSomething ="xxSomethingxxxxAndSomethingxElsexxx"
, sSomething.trim()
повернеться SomethingxxxxAndSomethingxElse
, зверніть увагу , що число x
між словами не змінюється.
Якщо ви хочете, щоб акуратний пакетний рядок поєднувався trim()
з регулярним виразом, як показано в цій публікації: Як видалити повторювані пробіли в рядку за допомогою Java? .
Порядок безглуздий для результату, але trim()
спочатку був би більш ефективним. Сподіваюся, це допомагає.
Javadoc for String має всі деталі. Видаляє пробіл (пробіл, вкладки тощо) з обох кінців і повертає нову рядок.
Якщо ви хочете перевірити, що буде робити якийсь метод, ви можете скористатися BeanShell . Це мова сценаріїв, покликана максимально наблизитися до Java. Взагалі, це тлумачить Ява з деякими розслабленнями. Ще один варіант такого роду - Groovy мова. Обидві ці мови сценаріїв забезпечують зручне знання циклу Read-Eval-Print з інтерпретованих мов. Таким чином, ви можете запустити консоль і просто ввести:
" content ".trim();
Ви побачите "content"
результат після натискання Enter
(або Ctrl+R
в консолі Groovy).
String formattedStr=unformattedStr;
formattedStr=formattedStr.trim().replaceAll("\\s+", " ");
trim()
вже робить те, що repkaceAll()
зробив би, якби для цього було щось.