जवाबों:
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:@" "];
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+
विस्तार में आसानी, प्रदर्शन, कोड की संख्या और बनाई गई वस्तुओं की संख्या इस समाधान को उपयुक्त बनाती है।
stringByReplacingOccurrencesOfString:
। विश्वास नहीं कर सकता कि मुझे नहीं पता था।
वास्तव में, इसका एक बहुत ही सरल समाधान है:
NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
( स्रोत )
रेगेक्स के साथ, लेकिन बिना किसी बाहरी ढांचे की आवश्यकता के:
NSString *theString = @" Hello this is a long string! ";
theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, theString.length)];
NSRegularExpressionSearch
कहना है कि यह केवल rangeOfString:...
विधियों के साथ काम करता है
एक लाइन समाधान:
NSString *whitespaceString = @" String with whitespaces ";
NSString *trimmedString = [whitespaceString
stringByReplacingOccurrencesOfString:@" " withString:@""];
यह करना चाहिए ...
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:@" "];
Regex का एक अन्य विकल्प RegexKitLite है , जो iPhone प्रोजेक्ट में एम्बेड करना बहुत आसान है:
[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
यहाँ एक से एक टुकड़ा है 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;
}
वैकल्पिक समाधान: अपने आप को OgreKit (कोको नियमित अभिव्यक्ति पुस्तकालय) की एक प्रति प्राप्त करें।
पूरा समारोह तब है:
NSString *theStringTrimmed =
[theString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression *regex =
[OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);
छोटा एवं सुन्दर।
यदि आप सबसे तेज़ समाधान के बाद हैं, तो उपयोग करने वाले निर्देशों का सावधानीपूर्वक निर्मित श्रृंखला NSScanner
शायद सबसे अच्छा काम करेगी लेकिन यह केवल तभी आवश्यक होगा जब आप पाठ के विशाल (कई मेगाबाइट) ब्लॉकों को संसाधित करने की योजना बनाते हैं।
@ मैथ्यू गोडर्ट के अनुसार सबसे अच्छा उत्तर है, लेकिन कुछ रेखा गायब है, सभी उत्तर सिर्फ शब्दों के बीच की जगह को कम करते हैं, लेकिन जब टैब में जगह होती है या टैब होता है, जैसे: "यह टेक्स्ट \ 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"
आप एक साधारण तर्क का उपयोग भी कर सकते हैं। वहाँ कोई RegEx जादू नहीं है, इसलिए शायद इसे समझना और भविष्य में बदलना आसान है:
while([yourNSStringObject replaceOccurrencesOfString:@" "
withString:@" "
options:0
range:NSMakeRange(0, [yourNSStringObject length])] > 0);
आवश्यकताओं के आधार पर दो नियमित अभिव्यक्तियाँ काम करेंगी
फिर stringByReplacingOccurrencesOfString:withString:options:range:
उन्हें एकल सफेद स्थान से बदलने के लिए nsstring की आवृत्ति विधि लागू करें।
जैसे
[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];
नोट: मैंने iOS 5.x और इसके बाद के संस्करण की कार्यक्षमता के लिए 'RegexKitLite' लाइब्रेरी का उपयोग नहीं किया।