2009-09-17 14 views
36

जेडीके की String.trim() विधि बहुत बेवकूफ है, और केवल एसीआई नियंत्रण पात्रों को हटा देती है।जावा में एक स्ट्रिंग से सफेद जगहों को सही ढंग से कैसे ट्रिम करें?

अपाचे कॉमन्स 'StringUtils.strip() थोड़ा बेहतर है, लेकिन जेडीके के Character.isWhitespace() का उपयोग करता है, जो doesn't recognize non-breaking space as whitespace है।

तो जावा में स्ट्रिंग को ट्रिम करने के लिए सबसे पूर्ण, यूनिकोड-संगत, सुरक्षित और उचित तरीका क्या होगा?

और आकस्मिक रूप से, commons-lang से बेहतर लाइब्रेरी है कि मुझे इस तरह के सामान के लिए उपयोग करना चाहिए?

उत्तर

55

गूगल ने हाल ही guava-libraries उपलब्ध कराए हैं। यह may have आप के लिए क्या देख रहे:

CharMatcher.inRange('\0', ' ').trimFrom(str) 

String.trim() के बराबर है, लेकिन आप, क्या ट्रिम JavaDoc का उल्लेख करने के अनुकूलित कर सकते हैं।

CharMatcher.WHITESPACE.trimFrom(str) 
+2

upvoted। मुझे वह याद आएगा। – itsadok

+0

अमरूद के सूचक के लिए धन्यवाद लग रहा है बनाने के लिए – CPerkins

+1

युक्ति: ['trimAndCollapseFrom'] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/CharMatcher.html#trimAndCollapseFrom (java.lang.CharSequence,% 20char)) स्ट्रिंग के अंदर डुप्लिकेट मानों को प्रतिस्थापित करते समय स्ट्रिंग के बाहर trims। –

2

मुझे लगभग हर परिदृश्य के लिए बहुत अच्छी तरह से काम करने के लिए हमेशा trim मिला है।

हालांकि, अगर आप वास्तव में अधिक वर्ण शामिल करना चाहते हैं, तो आप strip विधि commons-lang से Character.isWhitespace के लिए न केवल परीक्षण, लेकिन यह भी लगता है जो क्या कमी है होना करने के लिए Character.isSpaceChar के लिए शामिल करने के लिए संपादित कर सकते हैं। अर्थात्, stripStart और stripEnd क्रमश: निम्नलिखित लाइनों:

  • while ((start != strLen) && Character.isWhitespace(str.charAt(start)))
  • while ((end != 0) && Character.isWhitespace(str.charAt(end - 1)))
7

मैं कसम खाता हूँ मैं केवल मैं पोस्ट के बाद यह देखा:

उदाहरण के लिए, यह its own definition of WHITESPACE जो JDK से अलग है और नवीनतम यूनिकोड मानक के अनुसार परिभाषित किया गया है है, तो क्या आप की जरूरत के रूप में लिखा जा सकता है प्रश्न: Google ने कोर जावा उपयोगिताओं की एक लाइब्रेरी, Guava जारी की है।

मैं अभी तक इस प्रयास नहीं किया है, लेकिन मैं क्या बता सकता से, यह पूरी तरह से यूनिकोड अनुरूप है:

String s = " \t testing \u00a0" 
s = CharMatcher.WHITESPACE.trimFrom(s); 
+2

हाहा, मैंने केवल 5 मिनट पहले ही यही उत्तर प्रदान किया है, लेकिन फिर इसे उस सटीक कोड को शामिल करने के लिए संपादित किया है जिसका उपयोग करने के लिए आपको आवश्यक है, और फिर आपने अपनी टिप्पणी देखी कि आपको यह स्वयं मिला है। – CrazyCoder

2

यह क्या सफेद रिक्त स्थान का गठन किया परिभाषित करने के लिए बहुत मुश्किल है। कभी-कभी मैं यह सुनिश्चित करने के लिए गैर-ब्रेक करने योग्य रिक्त स्थान का उपयोग करता हूं कि यह छीन नहीं जाता है। तो आप जो चाहते हैं उसे करने के लिए लाइब्रेरी ढूंढना मुश्किल होगा।

यदि मैं हर सफेद स्थान को ट्रिम करना चाहता हूं तो मैं अपने स्वयं के ट्रिम() का उपयोग करता हूं। यहाँ समारोह मैं सफेद रिक्त स्थान के लिए जाँच करने के लिए उपयोग करते हैं, है

public static boolean isWhitespace (int ch) 
    { 
    if (ch == ' ' || (ch >= 0x9 && ch <= 0xD)) 
     return true; 
    if (ch < 0x85) // short-circuit optimization. 
     return false; 
    if (ch == 0x85 || ch == 0xA0 || ch == 0x1680 || ch == 0x180E) 
     return true; 
    if (ch < 0x2000 || ch > 0x3000) 
     return false; 
    return ch <= 0x200A || ch == 0x2028 || ch == 0x2029 
     || ch == 0x202F || ch == 0x205F || ch == 0x3000; 
    } 
+9

कृपया उन जादू स्थिरांक का नाम दें .. –

+6

जेडजेड कोडर - आप कहते हैं, "लाइब्रेरी को आप जो चाहते हैं उसे ठीक करना मुश्किल होगा।" सच नहीं! कहें कि आप सभी व्हाइटस्पेस _except_ a \ u00a0 (गैर-ब्रेकिंग स्पेस) से मेल खाना चाहते हैं। आसान: CharMatcher.WHITESPACE.and (CharMatcher.isNot ('\ u00a0'))। TrimFrom (इनपुट) –

+2

@ केविनबोरिलियन सिर्फ 'CharMatcher.WHITESPACE' के लिए एक बड़ा "धन्यवाद" भेजना चाहता था। 'स्ट्रिंग # ट्रिम()' यूनिकोड के साथ इतना कठिन विफल रहता है। –

0

मैंने किया था जावा के ट्रिम() विधि पर थोड़ा परिवर्तन और यह गैर-ascii characters.This विधि का समर्थन करता है तेजी से कार्यान्वयन की तुलना में सबसे चलाता है।

public static String trimAdvanced(String value) { 

     Objects.requireNonNull(value); 

     int strLength = value.length(); 
     int len = value.length(); 
     int st = 0; 
     char[] val = value.toCharArray(); 

     if (strLength == 0) { 
      return ""; 
     } 

     while ((st < len) && (val[st] <= ' ') || (val[st] == '\u00A0')) { 
      st++; 
      if (st == strLength) { 
       break; 
      } 
     } 
     while ((st < len) && (val[len - 1] <= ' ') || (val[len - 1] == '\u00A0')) { 
      len--; 
      if (len == 0) { 
       break; 
      } 
     } 


     return (st > len) ? "" : ((st > 0) || (len < strLength)) ? value.substring(st, len) : value; 
    } 
मुझे एक झटका की तरह
संबंधित मुद्दे