Java'da şöyle bir String var:
" content ".
String.trim()
Bu taraflardaki tüm boşlukları mı yoksa her birindeki tek bir alanı mı kaldıracak?
Java'da şöyle bir String var:
" content ".
String.trim()
Bu taraflardaki tüm boşlukları mı yoksa her birindeki tek bir alanı mı kaldıracak?
Yanıtlar:
Hepsi .
Döndürür : Baştaki ve sondaki beyaz boşluk kaldırılmış bu dizenin bir kopyası veya başında veya sonunda beyaz boşluk yoksa bu dizenin bir kopyası.
~ Java 1.5.0 belgelerinden alıntılanmıştır
(Ama neden denemedin ve kendin görmedin?)
Chararacter.isWhitespace
doğru olduğu mantıklı görünüyor , ancak "boşluk" ile
trim
, isWhiteSpace
vb. veya Java belgelerindeki belirsizliklerin tartışılması amaçlanmamıştır; yukarıda sorulan belirli soruya basit bir cevaptır - yani, trim
yöntem tek bir boşluğu mu yoksa birden fazla boşluğu mu kaldırıyor?
Kaynak kodundan (derlenmiş):
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);
}
Görebildiğiniz ikisi while
, unicode'u boşluk karakterinin altında, başında ve sonunda olan tüm karakterlerin kaldırıldığı anlamına gelir.
Şüphe duyduğunuzda bir birim testi yazın:
@Test
public void trimRemoveAllBlanks(){
assertThat(" content ".trim(), is("content"));
}
Not : tabii ki test (JUnit + Hamcrest için) başarısız olmaz
Yine de belirtilmesi gereken bir şey, String.trim'in kendine özgü bir "boşluk" tanımına sahip olmasıdır. Unicode boşluklarını kaldırmaz, ancak boşluk olarak kabul etmeyebileceğiniz ASCII kontrol karakterlerini de kaldırır.
Bu yöntem, bir dizenin başından ve sonundan boşlukları kırpmak için kullanılabilir; aslında, tüm ASCII kontrol karakterlerini de kırpar.
Mümkünse, Unicode beyaz boşlukları da işleyen (ve aynı zamanda null güvenli olan) Commons Lang'ın StringUtils.strip () yöntemini kullanmak isteyebilirsiniz.
String sınıfı için API'ye bakın :
Dizenin başında ve sonunda boşluk bırakılmış bir kopyasını döndürür.
Her iki taraftaki boşluk kaldırılır:
Not trim()
: String örneği değişmez, bu yeni bir nesne döndürür:
String original = " content ";
String withoutWhitespace = original.trim();
// original still refers to " content "
// and withoutWhitespace refers to "content"
Java docs dayanarak burada , .trim()
yaygın boşluk olarak bilinen cümledeki '\ u0020'.
Ancak, '\ u00A0' ( Unicode NO-BREAK BOŞLUK
) da bir boşluk olarak görülüyor ve .trim()
bunu KALDIRMAZ. Bu özellikle HTML'de yaygındır.
Kaldırmak için kullanıyorum:
tmpTrimStr = tmpTrimStr.replaceAll("\\u00A0", "");
Bu sorunun bir örneği burada tartışıldı .
Java'nın trim()
boşlukları kaldırmasına örnek :
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);
}
}
ÇIKTI
old =
This is a String.
new = This is a String.
Java belgelerinden (String sınıfı kaynağı),
/**
* 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;
}
Başlangıç ve uzunluğu aldıktan sonra, String sınıfının alt dize yöntemini çağırdığına dikkat edin.
trim()
tüm baştaki ve sondaki boşlukları kaldıracaktır. Ancak unutmayın: Diziniz değişmez. trim()
bunun yerine yeni bir dize örneği döndürecektir.
String girişiniz:
String a = " abc ";
System.out.println(a);
Evet, çıktı "abc" olacaktır; Ancak String girişiniz:
String b = " This is a test "
System.out.println(b);
Çıktı olacak This is a test
So trim yalnızca ilk karakterinizden önceki ve dizedeki son karakterinizden sonraki boşlukları kaldırır ve iç boşlukları yok sayar. Bu, dahili String
kırpma yöntemini biraz optimize eden ve dizedeki ilk ve son karakterinizden önceki ve sonraki boşlukları kaldıran kodumun bir parçası . Umarım yardımcı olur.
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()
içinde System.out.println(a);
?
Çok önemli bir şey, tamamen "beyaz boşluklardan" oluşan bir dizenin boş bir dizge döndürmesidir.
Bir varsa string sSomething = "xxxxx"
, nerede x
beyaz alanlar için durmak, sSomething.trim()
boş bir dize döndürür.
beyaz boşlukların durduğu string sSomething = "xxAxx"
yerde a ise geri dönecektir .x
sSomething.trim()
A
eğer sSomething ="xxSomethingxxxxAndSomethingxElsexxx"
, sSomething.trim()
dönecekse SomethingxxxxAndSomethingxElse
, x
sözcükler arasındaki sayının değişmediğine dikkat edin.
Düzgün paketlenmiş bir dize trim()
, bu yayında gösterildiği gibi normal ifade ile birleştirmek istiyorsanız : Java kullanarak dizede yinelenen beyaz boşluklar nasıl kaldırılır? .
Sipariş, sonuç için anlamsızdır ama trim()
önce daha verimli olacaktır. Umarım yardımcı olur.
Javadoc for String tüm detaylara sahiptir. Her iki uçtaki beyaz boşluğu (boşluk, sekmeler vb.) Kaldırır ve yeni bir dize döndürür.
Bir yöntemin ne işe yarayacağını kontrol etmek istiyorsanız BeanShell'i kullanabilirsiniz . Java'ya olabildiğince yakın olacak şekilde tasarlanmış bir betik dilidir. Genel olarak konuşursak, bazı rahatlamalarla Java olarak yorumlanır. Bu türden bir başka seçenek de Groovy dilidir. Bu komut dosyası dillerinin her ikisi de, yorumlanan dillerden bilinen uygun Oku-Değerlendir-Yazdır döngüsü sağlar. Böylece konsolu çalıştırıp şunu yazabilirsiniz:
" content ".trim();
Tuşuna "content"
bastıktan sonra Enter
(veya Ctrl+R
Groovy konsolunda) sonuç olarak göreceksiniz .
String formattedStr=unformattedStr;
formattedStr=formattedStr.trim().replaceAll("\\s+", " ");
trim()
Zaten repkaceAll()
yapacak bir şey kalsa ne yapacağını yapıyor.