Java String.trim () कितने स्पेस को हटाएगा?


117

जावा में, मेरे पास एक स्ट्रिंग है जैसे:

"     content     ".

क्या String.trim()इन स्थानों पर सभी रिक्त स्थान या प्रत्येक पर सिर्फ एक स्थान हटा देगा ?


197
नीचे की ओर: आपका व्यवहार कृपालु है। यह प्रश्न विस्तृत और विशिष्ट है, स्पष्ट रूप से और सरल रूप से लिखा गया है, कहीं न कहीं कम से कम एक अन्य प्रोग्रामर के लिए। लोग यह नहीं जान सकते हैं कि जावदोक या स्रोत कोड को कहां देखना है। हमारा काम उनकी मदद करना है, न कि उन्हें अज्ञानी होने के लिए कोसना।
13

14
@subtenante, आप सही हैं। मैंने पहले भी google'ish सवाल पूछने के लिए लोगों का बचाव किया है। हालाँकि, यह जितना सरल है, किसी का स्वयं और IMO पर परीक्षण किया जाना चाहिए, कभी भी प्रश्नोत्तर को प्रश्नोत्तर साइट पर पोस्ट नहीं करना चाहिए। शीर्षक भ्रामक है और क्यू उन सभी के लिए समय की बर्बादी है जो इसे पढ़ते हैं।
क्रिस

9
@ क्रिस: oneat ने मुझे स्रोत कोड को देखने का अवसर दिया। मैंने ट्रिम () के बारे में बहुत कुछ सीखा। मैं अन्यथा नहीं होता। अपने समय के अपने खर्च के लिए हर कोई जिम्मेदार है। खाने के लिए हमें दोषी नहीं ठहराया जा सकता है क्योंकि हमें उनके भोले-भाले सवाल से लाभ नहीं मिल पा रहा है।
Glmxndr

1
@skaffman: (c) होना चाहिए "इसे देखें और देखें", और उसके बाद ही (d) SO पर पूछें।
मैक

2
यह प्रश्न ऑफ़-टॉपिक प्रतीत होता है क्योंकि यह ऐसी चीज़ के बारे में है जिसे किसी को एक मिनट के अंदर मैनुअल और परीक्षण में खोजने में सक्षम होना चाहिए।
जैस्पर

जवाबों:


168

उन सभी को

रिटर्न : इस स्ट्रिंग की एक प्रतिलिपि जो सफेद स्थान को हटाती या पीछे ले जाती है, या यह स्ट्रिंग, जिसके पास कोई अग्रणी या सफेद स्थान नहीं है।

~ जावा 1.5.0 डॉक्स से उद्धृत

(लेकिन आपने इसे सिर्फ अपने लिए क्यों नहीं देखा?)


1
मुझे वोट डाउन करना पड़ा क्योंकि यह उत्तर कवर नहीं करता है कि "व्हाट्सएप" द्वारा प्रलेखन का क्या मतलब है। यह तर्कसंगत लगेगा कि यह वही होगा जहाँ Chararacter.isWhitespaceयह सच है, लेकिन "
व्हाट्सएप

7
@ user2864740: यह उत्तर trim, isWhiteSpaceआदि, या जावा डॉक्स में अस्पष्टता की चर्चा का व्यापक विश्लेषण करने का इरादा नहीं है ; यह ऊपर पूछे गए विशिष्ट प्रश्न का एक सीधा जवाब है - अर्थात, क्या trimविधि एक एकल स्थान या कई रिक्त स्थान को हटा देती है?
ल्यूक

मुझे पता है कि यह नहीं है। मैंने नीचे मतदान किया क्योंकि यह ऐसे बिंदु को इंगित करने में विफल रहता है, यहां तक ​​कि पास होने में भी। किसी भी स्थिति में, मैं अपने वोट को पूर्ववत नहीं कर सकता जब तक कि इसे अपडेट नहीं किया जाता (हालांकि न्यूनतम रूप से)।
user2864740

33

स्रोत कोड से (विघटित):

  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जो आप देख सकते हैं, वे सभी वर्ण जिनका यूनिकोड अंतरिक्ष के चरित्र के नीचे है, शुरुआत और अंत में हटा दिए जाते हैं।


27

जब संदेह हो, तो एक इकाई परीक्षण लिखें:

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

NB : बेशक परीक्षण (JUnit + Hamcrest के लिए) विफल नहीं होता है


43
एक नए प्रोग्रामर से पूछें कि सिर्फ एक System.out.println कैसे करना है, यह देखने के लिए एक यूनिट टेस्ट करें कि परिणाम क्या है ...
jaxkodex

26

हालांकि, एक बात और बताई जा सकती है कि String.trim की "व्हॉट्सएप" की एक अजीब परिभाषा है। यह यूनिकोड व्हाट्सएप को नहीं हटाता है, बल्कि ASCII नियंत्रण वर्णों को भी हटा देता है जिसे आप व्हाट्सएप नहीं मान सकते।

इस पद्धति का उपयोग एक स्ट्रिंग की शुरुआत और अंत से व्हाट्सएप ट्रिम करने के लिए किया जा सकता है; वास्तव में, यह सभी ASCII नियंत्रण वर्णों को भी प्रभावित करता है।

यदि संभव हो, तो आप कॉमन्स लैंग के स्ट्रिंगरगिल्स.स्ट्रिप () का उपयोग करना चाह सकते हैं, जो कि यूनिकोड व्हाट्सएप भी संभालता है (और अशक्त है, भी)।


3
डिजाइनरों भाग पर एक भयानक निरीक्षण की तरह लगता है .. और बहुत अधिक प्रलेखन के तकनीकी काम ज्यादा मदद नहीं करता है।
user2864740

2
वाहवाही! आपने स्टैकऑवरफ्लो पर पूछे गए सबसे सरल प्रश्न को लिया और इसके बारे में कहने के लिए कुछ बुद्धिमान पाया। तुम दौड़ के लिए एक क्रेडिट हो।
मार्क मैककेना

3
@MarkMcKenna: मुझे पता चलता है कि ये कथित रूप से सुपर-सरल प्रोग्रामिंग प्रश्न (ट्रिमिंग स्ट्रिंग्स, फ़ाइल नाम एक्सटेंशन आदि खोजना) हमेशा उनकी छिपी हुई जटिलताएं हैं। यह हमारे शिल्प और उपकरणों के बारे में थोड़ा सा मोहभंग है।
थिलो

15

स्ट्रिंग वर्ग के लिए एपीआई देखें :

स्ट्रिंग की एक प्रतिलिपि लौटाता है, जिसके साथ व्हाट्सएप लोप हो जाता है।

दोनों तरफ के व्हाट्सएप को हटा दिया गया है:

नोट करें कि trim()स्ट्रिंग का उदाहरण नहीं बदलता है, यह एक नई वस्तु लौटाएगा:

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

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

1
वास्तव में कुछ भी स्ट्रिंग का उदाहरण नहीं बदल सकता (कुछ गंदे चीजों को छोड़कर जो वीएम को क्रैश कर सकता है)
AvrDragon

13

यहाँ जावा डॉक्स के आधार पर , .trim()'\ u0020' को प्रतिस्थापित किया जाता है जिसे आमतौर पर व्हाट्सएप के रूप में जाना जाता है।

लेकिन ध्यान दें, '\ u00A0' ( यूनिकोड NO-BREAK स्पेस &nbsp; ) को व्हॉट्सएप के रूप में भी देखा जाता है, और .trim()इसे हटाया नहीं जाएगा। यह HTML में विशेष रूप से आम है।

इसे हटाने के लिए, मैं उपयोग करता हूं:

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

इस समस्या का एक उदाहरण यहाँ चर्चा की गई थी ।


जावदोक के आधार पर यह प्रमुख और अनुगामी व्हाट्सएप को हटाता है , जिसमें स्पेस, टैब, न्यूलाइन कैरिज रिटर्न, फॉर्म फीड ... और जो ऐसे वर्णों को शामिल करता है जो अग्रणी या अनुगामी नहीं हैं।
लोर्न

धन्यवाद, यह मुझे आवंटित करने में मदद करता है
असद हैदर

8

जावा 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.

4

जावा डॉक्स (स्ट्रिंग क्लास सोर्स) से,

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

ध्यान दें कि शुरुआत और लंबाई मिलने के बाद यह स्ट्रिंग क्लास की प्रतिस्थापन विधि कहलाती है।


जहाँ "व्हाट्सएप" "x20" के बराबर या उससे कम मूल्यों वाला वर्ण है।
user2864740

3

trim()सभी प्रमुख और अनुगामी रिक्त स्थान को निकाल देगा। लेकिन ध्यान रखें: आपका स्ट्रिंग नहीं बदला गया है। trim()इसके बजाय एक नया स्ट्रिंग उदाहरण लौटाएगा।


यह सभी प्रमुख और अनुगामी व्हाट्सएप
लोर्न

3

यदि आपका स्ट्रिंग इनपुट है:

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

हां, आउटपुट होगा, "एबीसी"; लेकिन अगर आपका स्ट्रिंग इनपुट है:

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);?
अर्जन

2

यह दोनों तरफ के सभी रिक्त स्थान को हटा देगा।


2

एक बहुत महत्वपूर्ण बात यह है कि पूरी तरह से "सफेद रिक्त स्थान" से बना एक स्ट्रिंग एक खाली स्ट्रिंग लौटाएगा।

यदि कोई है string sSomething = "xxxxx", जहां xसफेद रिक्त स्थान के लिए खड़ा है , तो एक sSomething.trim()खाली स्ट्रिंग लौटाएगा।

यदि एक string sSomething = "xxAxx", जहां xसफेद रिक्त स्थान के लिए खड़ा है, sSomething.trim()वापस आ जाएगा A

यदि sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim()वापस आएगा SomethingxxxxAndSomethingxElse, तो ध्यान दें कि xशब्दों के बीच की संख्या में परिवर्तन नहीं किया गया है।

यदि आप trim()इस पोस्ट में दिखाए गए अनुसार रेगेक्स के साथ एक साफ पैकेट वाला स्ट्रिंग संयोजन चाहते हैं : जावा का उपयोग करके स्ट्रिंग में डुप्लिकेट सफेद रिक्त स्थान कैसे निकालें?

आदेश परिणाम के लिए अर्थहीन है, लेकिन trim()पहले अधिक कुशल होगा। आशा करता हूँ की ये काम करेगा।


2

स्ट्रिंग के लिए केवल एक उदाहरण रखने के लिए, आप निम्नलिखित का उपयोग कर सकते हैं।

str = "  Hello   ";

या

str = str.trim();

फिर strस्ट्रिंग का मूल्य , होगाstr = "Hello"


0

ट्रिम () दोनों पक्षों के लिए काम करता है।


0

स्ट्रिंग के लिए Javadoc में सभी विवरण हैं। दोनों छोर से सफेद स्थान (स्थान, टैब, आदि) को निकालता है और एक नया स्ट्रिंग लौटाता है।


0

यदि आप जांचना चाहते हैं कि कुछ विधि क्या होगी, तो आप बीनशेल का उपयोग कर सकते हैं । यह एक स्क्रिप्टिंग भाषा है जिसे जावा के जितना संभव हो उतना करीब से बनाया गया है। आम तौर पर बोलते हुए यह जावा को कुछ आराम के साथ व्याख्यायित किया जाता है। इस तरह का एक और विकल्प ग्रूवी भाषा है। ये दोनों स्क्रिप्टिंग भाषाएं व्याख्यात्मक भाषाओं से सुविधाजनक रीड-एवल-प्रिंट लूप प्रदान करती हैं। तो आप कंसोल चला सकते हैं और बस टाइप करें:

"     content     ".trim();

आपको "content"दबाने के बाद परिणाम दिखाई देगा Enter(या Ctrl+Rग्रूवी कंसोल में)।


6
तो जावा में एक विधि को समझने के लिए उसे एक पूरी तरह से नई भाषा सीखना चाहिए। वास्तव में?
james.garriss

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

यह सवाल से संबंधित नहीं है।
मार्क मैककेना

2
@Mark लेकिन गलती से यह वही था जिसे मैं देख रहा था जब मैंने यह सवाल खोला ...
आर्मफुट

यह भी व्यर्थ है। trim()पहले से ही क्या repkaceAll()करना है, अगर वहाँ कुछ भी करने के लिए इसे छोड़ दिया गया था।
को लोर्ने

@EJP रिप्लेसमैटल भी व्हाट्सएप को एक सिंगल स्पेस के साथ बदल देगा, जबकि ट्रिम केवल प्रमुख और अनुगामी रिक्त स्थान को संभालेगा
कृष्ण
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.