Câu trả lời:
Sử dụng giải pháp regexp gốc do hfossli cung cấp.
Sử dụng thư viện regexp yêu thích của bạn hoặc sử dụng giải pháp gốc Cacao sau:
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 và NSCharacterSet sẵn sàng trợ giúp bạn. Giải pháp này cắt bỏ khoảng trắng đầu và cuối cũng như nhiều khoảng trắng.
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]];
Ghi nhật ký final
mang lại
"Hello this is a long string!"
Các mẫu regex thay thế có thể có:
[ ]+
[ \\t]+
\\s+
Tính dễ mở rộng, hiệu suất, số dòng mã và số lượng đối tượng được tạo làm cho giải pháp này trở nên phù hợp.
stringByReplacingOccurrencesOfString:
. Không thể tin rằng tôi đã không biết điều đó.
Trên thực tế, có một giải pháp rất đơn giản cho điều đó:
NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
( Nguồn )
Với regex, nhưng không cần bất kỳ khung bên ngoài nào:
NSString *theString = @" Hello this is a long string! ";
theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, theString.length)];
NSRegularExpressionSearch
biết rằng nó chỉ làm việc với các rangeOfString:...
phương pháp
Một giải pháp một dòng:
NSString *whitespaceString = @" String with whitespaces ";
NSString *trimmedString = [whitespaceString
stringByReplacingOccurrencesOfString:@" " withString:@""];
Điều này nên làm điều đó ...
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:@" "];
Một tùy chọn khác cho regex là RegexKitLite , rất dễ nhúng vào dự án iPhone:
[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
Dưới đây là một đoạn trích từ một NSString
phần mở rộng, nơi "self"
là NSString
ví dụ. Nó có thể được sử dụng để thu gọn khoảng trắng liền kề thành một khoảng trắng duy nhất bằng cách chuyển vào [NSCharacterSet whitespaceAndNewlineCharacterSet]
và ' '
chuyển đến hai đối số.
- (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;
}
Giải pháp thay thế: kiếm cho mình một bản sao của OgreKit (thư viện biểu thức chính quy Cocoa).
Toàn bộ chức năng sau đó là:
NSString *theStringTrimmed =
[theString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression *regex =
[OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);
Ngắn và ngọt.
Nếu bạn đang theo đuổi giải pháp nhanh nhất, một loạt hướng dẫn được xây dựng cẩn thận NSScanner
có thể sẽ hoạt động tốt nhất nhưng điều đó chỉ cần thiết nếu bạn định xử lý khối văn bản khổng lồ (nhiều megabyte).
theo @Mathieu Godart là câu trả lời hay nhất, nhưng thiếu một số dòng, tất cả các câu trả lời chỉ làm giảm khoảng cách giữa các từ, nhưng khi có tab hoặc có tab ở vị trí, như thế này: "đây là văn bản \ t và \ tTab ở giữa, vân vân "trong mã ba dòng, chúng ta sẽ: chuỗi chúng ta muốn giảm khoảng trắng
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]];
kết quả là
"this is text , and Tab between , so on"
mà không cần thay thế tab, resul sẽ là:
"this is text , and Tab between , so on"
Bạn cũng có thể sử dụng một đối số while đơn giản. Không có phép thuật RegEx nào ở đó, vì vậy có thể dễ hiểu hơn và thay đổi trong tương lai:
while([yourNSStringObject replaceOccurrencesOfString:@" "
withString:@" "
options:0
range:NSMakeRange(0, [yourNSStringObject length])] > 0);
Hai biểu thức chính quy sau sẽ hoạt động tùy thuộc vào yêu cầu
Sau đó, áp dụng phương thức thể hiện của nsstring stringByReplacingOccurrencesOfString:withString:options:range:
để thay thế chúng bằng một khoảng trắng duy nhất.
ví dụ
[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];
Lưu ý: Tôi đã không sử dụng thư viện 'RegexKitLite' cho chức năng trên cho iOS 5.x trở lên.