एक ही चरित्र में सफेद स्थान के अनुक्रम को संकुचित करें और स्ट्रिंग को ट्रिम करें


122

निम्नलिखित उदाहरण पर विचार करें:

"    Hello      this  is a   long       string!   "

मैं उसे रूपांतरित करना चाहता हूं:

"Hello this is a long string!"

जवाबों:


125

OS X 10.7+ और iOS 3.2+

Hfossli द्वारा प्रदान किए गए देशी रेगेक्सप समाधान का उपयोग करें ।

अन्यथा

या तो अपने पसंदीदा regexp लाइब्रेरी का उपयोग करें या निम्न कोको-देशी समाधान का उपयोग करें:

NSString *theString = @"    Hello      this  is a   long       string!   ";

NSCharacterSet *whitespaces = [NSCharacterSet whitespaceCharacterSet];
NSPredicate *noEmptyStrings = [NSPredicate predicateWithFormat:@"SELF != ''"];

NSArray *parts = [theString componentsSeparatedByCharactersInSet:whitespaces];
NSArray *filteredArray = [parts filteredArrayUsingPredicate:noEmptyStrings];
theString = [filteredArray componentsJoinedByString:@" "];

4
मैं समाप्त करने के लिए ट्रिम के साथ regex प्रतिस्थापन के लिए इस प्रदर्शन की तुलना में उत्सुक हूं। एक ओर, आपके पास निपटने के लिए एक रेगेक्स है। दूसरे पर, आपके पास एक विधेय है। या तो संबंधित अभिव्यक्तियों के आंतरिक प्रसंस्करण की आवश्यकता होती है।
lilbyrdie

@ लिलीबर्डी: यह उस स्ट्रिंग पर निर्भर करता है जो मुझे लगता है, कितने व्हाट्सएप हैं। मेरा समाधान काफी धीमा है, क्योंकि यह प्रत्येक प्रतिस्थापन के लिए एक नई वस्तु बनाता है और उनमें से प्रत्येक को विधि कॉल भेजता है।
जॉर्ज शॉली

2
ठीक जवाब, इस तरह upvoted, लेकिन मैं "आसान" की आपकी परिभाषा को चुनौती देता हूं। निष्ठा से, पूर्व अजगर अब
ObjC-

2
तुमने मुझे हँसाया 'अगर आसान नहीं है तो जटिल समाधानों का उपयोग न करें।' तो सबसे आसान एक है [toBeTrimmed stringByReplacingOccurrencesOfString: @ "withString: @" "] नहीं? मैं अभी भी आपके उत्तर को बढ़ाता हूं लेकिन यह निश्चित रूप से सबसे आसान है
मेरियो कार्वाल्हो

2
@ MárioCarvalho सवाल पूछता है कि अतिरिक्त व्हाट्सएप को कैसे हटाया जाए , यह सब नहीं।
स्विलियेट्स

52

Regex और NSCharacterSet आपकी सहायता के लिए यहां है। यह समाधान व्हाट्सएप के साथ-साथ कई व्हाट्सएप को अग्रणी और अनुगामी बनाता है।

NSString *original = @"    Hello      this  is a   long       string!   ";

NSString *squashed = [original stringByReplacingOccurrencesOfString:@"[ ]+"
                                                         withString:@" "
                                                            options:NSRegularExpressionSearch
                                                              range:NSMakeRange(0, original.length)];

NSString *final = [squashed stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

लॉगिंग finalदेता है

"Hello this is a long string!"

संभावित वैकल्पिक रेगेक्स पैटर्न:

  • केवल स्थान बदलें: [ ]+
  • स्थान और टैब बदलें: [ \\t]+
  • स्थान, टैब और नई सूची बदलें: \\s+

प्रदर्शन खराब कर दिया

विस्तार में आसानी, प्रदर्शन, कोड की संख्या और बनाई गई वस्तुओं की संख्या इस समाधान को उपयुक्त बनाती है।


3
hfossli का सबसे सुंदर उत्तर है, मेरी पुस्तक में। इसके अलावा, मैंने अभी सीखा कि आप नियमित अभिव्यक्ति का उपयोग कर सकते हैं stringByReplacingOccurrencesOfString:। विश्वास नहीं कर सकता कि मुझे नहीं पता था।
davidf2281

1
बहुत बढ़िया। एक आकर्षण की तरह काम किया
कुशाल अशोक

41

वास्तव में, इसका एक बहुत ही सरल समाधान है:

NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                                  [NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)

( स्रोत )


29
मुझे लगता है कि यह केवल अग्रणी और अनुगामी रिक्त स्थान को समाप्त करेगा, और उन सभी को समाप्त करेगा। यह "हैलो फू" के साथ सौदा नहीं करेगा
ब्रायन पोस्टो

2
d * mn लाइन एंडिंग्स और ऑटो-फॉर्मेट ... यह "hello______foo" (मान _ -> "" के साथ सौदा नहीं करता क्योंकि प्रारूपण टिप्पणी कठिन है)
ब्रायन पोस्टो

32
आप लोग क्यों वोट देते हैं और जवाब देते हैं जो सवाल का समाधान नहीं देता है? stringByTrimmingCharactersInSet स्ट्रिंग के किनारों पर केवल आइसिड का विश्लेषण नहीं करता है और न ही करता है। जॉर्ज Sholly द्वारा उत्तर सही है।
लुकाज़

3
सवाल का जवाब नहीं था, लेकिन यह मुझे यकीन है कि मदद की। धन्यवाद
daveMac

1
एक ही समय में अग्रणी और अनुगामी स्थान को निकालने के लिए उत्कृष्ट कोड।
user523234

13

रेगेक्स के साथ, लेकिन बिना किसी बाहरी ढांचे की आवश्यकता के:

NSString *theString = @"    Hello      this  is a   long       string!   ";

theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
                       options:NSRegularExpressionSearch
                       range:NSMakeRange(0, theString.length)];

आपको तब भी परिणाम को ट्रिम करने की आवश्यकता होगी, या आप व्हॉट्सएप के साथ गद्देदार होंगे। यह शायद सबसे सरल जवाब है, हालांकि।
लिलबर्डी

2
के लिए प्रलेखन का NSRegularExpressionSearchकहना है कि यह केवल rangeOfString:...विधियों के साथ काम करता है
user102008

9

एक लाइन समाधान:

NSString *whitespaceString = @" String with whitespaces ";

NSString *trimmedString = [whitespaceString
        stringByReplacingOccurrencesOfString:@" " withString:@""];

2
मेरी मदद की :)। उसके लिए धन्यवाद!
18

5
जबकि यह उपयोगी है, यह सभी व्हाट्सएप को हटा देता है। ओपी मूल रूप से व्हॉट्सएप संघनन चाहता है, उदाहरण के लिए एक व्हाट्सएप पर लगातार व्हॉट्सएप की कमी के बाद एक ट्रिम।
lilbyrdie

एक अन्य नोट, यह समाधान टैब या newlines या रिक्त स्थान के अलावा व्हाट्सएप वर्णों के साथ कोई सौदा नहीं करता है।
fwielstra

2
यह ओपी का जवाब नहीं देता है, बल्कि स्ट्रिंग के सभी रिक्त स्थान को हटा देता है, इसलिए आप @ "स्ट्रिंगरविथविट्सस्पेस" के साथ समाप्त होते हैं
चार्ल्स

6

यह करना चाहिए ...

NSString *s = @"this is    a  string    with lots  of     white space";
NSArray *comps = [s componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

NSMutableArray *words = [NSMutableArray array];
for(NSString *comp in comps) {
  if([comp length] > 1)) {
    [words addObject:comp];
  }
}

NSString *result = [words componentsJoinedByString:@" "];

1
क्या यह वास्तव में स्ट्रिंग 'a' के साथ काम करता है? यह लंबाई 1 है, जहां तक ​​मैं देख सकता हूं, यह समाधान सभी विभाजित शब्दों को 0 और 1. के साथ फ़िल्टर करेगा
fwielstra

हां, यही जवाब मुझे उम्मीद था। धन्यवाद +1
पवन


3

इसे इस्तेमाल करे

NSString *theString = @"    Hello      this  is a   long       string!   ";

while ([theString rangeOfString:@"  "].location != NSNotFound) {
    theString = [theString stringByReplacingOccurrencesOfString:@"  " withString:@" "];
}

3

यहाँ एक से एक टुकड़ा है NSStringविस्तार, जहां "self"है NSStringउदाहरण। इसका उपयोग सन्दर्भित व्हाट्सएप को एक जगह में [NSCharacterSet whitespaceAndNewlineCharacterSet]और ' 'दो तर्कों को पारित करके ध्वस्त करने के लिए किया जा सकता है।

- (NSString *) stringCollapsingCharacterSet: (NSCharacterSet *) characterSet toCharacter: (unichar) ch {
int fullLength = [self length];
int length = 0;
unichar *newString = malloc(sizeof(unichar) * (fullLength + 1));

BOOL isInCharset = NO;
for (int i = 0; i < fullLength; i++) {
    unichar thisChar = [self characterAtIndex: i];

    if ([characterSet characterIsMember: thisChar]) {
        isInCharset = YES;
    }
    else {
        if (isInCharset) {
            newString[length++] = ch;
        }

        newString[length++] = thisChar;
        isInCharset = NO;
    }
}

newString[length] = '\0';

NSString *result = [NSString stringWithCharacters: newString length: length];

free(newString);

return result;
}

-1

वैकल्पिक समाधान: अपने आप को OgreKit (कोको नियमित अभिव्यक्ति पुस्तकालय) की एक प्रति प्राप्त करें।

पूरा समारोह तब है:

NSString *theStringTrimmed =
   [theString stringByTrimmingCharactersInSet:
        [NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression  *regex =
    [OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);

छोटा एवं सुन्दर।

यदि आप सबसे तेज़ समाधान के बाद हैं, तो उपयोग करने वाले निर्देशों का सावधानीपूर्वक निर्मित श्रृंखला NSScannerशायद सबसे अच्छा काम करेगी लेकिन यह केवल तभी आवश्यक होगा जब आप पाठ के विशाल (कई मेगाबाइट) ब्लॉकों को संसाधित करने की योजना बनाते हैं।


क्या RegExKitLite के बजाय OgreKit का उपयोग करने का कोई कारण है? regexkit.sourceforge.net यह एक बहुत ही समान प्रतिस्थापन है ।OfRegex कॉल, और मौजूदा RegEX पुस्तकालयों के शीर्ष पर काम करता है (यह सुनिश्चित नहीं है कि Ogre एक पूर्ण RegEX इंजन या क्या है)
Kendall Helmstetter Gelner

मुझे यकीन है कि दोनों काम करेंगे। मैं regexkit का उपयोग नहीं किया है, लेकिन इसका एक अच्छा सुझाव है। लोगों को अंतर्निहित पुस्तकालयों के आधार पर चुनना चाहिए: PERL- संगत पीसीआर (RegExKitLite) और रूबी-संगत Oniguruma (OgreKit)।
मैट गलाघेर

-1

@ मैथ्यू गोडर्ट के अनुसार सबसे अच्छा उत्तर है, लेकिन कुछ रेखा गायब है, सभी उत्तर सिर्फ शब्दों के बीच की जगह को कम करते हैं, लेकिन जब टैब में जगह होती है या टैब होता है, जैसे: "यह टेक्स्ट \ t, और \ tTab के बीच है, इसलिए "तीन लाइन कोड में हम करेंगे: स्ट्रिंग हम चाहते हैं कि सफेद स्थान कम हो

NSString * str_aLine = @"    this is text \t , and\tTab between      , so on    ";
// replace tabs to space
str_aLine = [str_aLine stringByReplacingOccurrencesOfString:@"\t" withString:@" "];
// reduce spaces to one space
str_aLine = [str_aLine stringByReplacingOccurrencesOfString:@" +" withString:@" "
                                                    options:NSRegularExpressionSearch
                                                      range:NSMakeRange(0, str_aLine.length)];
// trim begin and end from white spaces
str_aLine = [str_aLine stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

परिणाम है

"this is text , and Tab between , so on"

टैब को बदले बिना रिजुल होगा:

"this is text    , and  Tab between , so on"

-1

आप एक साधारण तर्क का उपयोग भी कर सकते हैं। वहाँ कोई RegEx जादू नहीं है, इसलिए शायद इसे समझना और भविष्य में बदलना आसान है:

while([yourNSStringObject replaceOccurrencesOfString:@"  "
                         withString:@" "
                         options:0
                         range:NSMakeRange(0, [yourNSStringObject length])] > 0);

1
प्रश्न का उत्तर नहीं देता :) यह व्हाट्सएप के अग्रणी और अनुगामी को नहीं हटाता है।
hfossli

-1

आवश्यकताओं के आधार पर दो नियमित अभिव्यक्तियाँ काम करेंगी

  1. सफेद रिक्त स्थान और टैब के मिलान के लिए @ "+"
  2. @ "\\ s {2,}" सफेद रिक्त स्थान, टैब और लाइन ब्रेक के मिलान के लिए

फिर stringByReplacingOccurrencesOfString:withString:options:range:उन्हें एकल सफेद स्थान से बदलने के लिए nsstring की आवृत्ति विधि लागू करें।

जैसे

[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];

नोट: मैंने iOS 5.x और इसके बाद के संस्करण की कार्यक्षमता के लिए 'RegexKitLite' लाइब्रेरी का उपयोग नहीं किया।


यह समाधान प्रमुख और अनुगामी व्हाट्सएप को नहीं हटाता है क्योंकि ओपी पूछता है।
hfossli

@hfossli अग्रणी / अनुगामी रिक्त स्थान सीधे NSString के stringByTrimmingCharactersInSet: नई / श्वेत रेखा वर्ण के साथ विधि कहकर हटाया जा सकता है। उपरोक्त समाधान उनके स्थान से स्वतंत्र अनावश्यक स्थानों को हटाने के लिए था।
अपलवई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.