Perhatikan contoh berikut:
" Hello this is a long string! "
Saya ingin mengubahnya menjadi:
"Hello this is a long string!"
Perhatikan contoh berikut:
" Hello this is a long string! "
Saya ingin mengubahnya menjadi:
"Hello this is a long string!"
Jawaban:
Gunakan solusi regexp asli yang disediakan oleh hfossli.
Gunakan perpustakaan regexp favorit Anda atau gunakan solusi asli Kakao berikut:
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 dan NSCharacterSet siap membantu Anda. Solusi ini memangkas spasi putih di depan dan di belakang serta beberapa spasi putih.
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]];
Penebangan final
memberi
"Hello this is a long string!"
Pola regex alternatif yang mungkin:
[ ]+
[ \\t]+
\\s+
Kemudahan ekstensi, kinerja, jumlah baris kode dan jumlah objek yang dibuat membuat solusi ini sesuai.
stringByReplacingOccurrencesOfString:
. Tidak percaya saya tidak tahu itu.
Sebenarnya, ada solusi yang sangat sederhana untuk itu:
NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
( Sumber )
Dengan regex, tetapi tanpa memerlukan kerangka kerja eksternal:
NSString *theString = @" Hello this is a long string! ";
theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, theString.length)];
NSRegularExpressionSearch
mengatakan bahwa itu hanya bekerja dengan rangeOfString:...
metode
Solusi satu baris:
NSString *whitespaceString = @" String with whitespaces ";
NSString *trimmedString = [whitespaceString
stringByReplacingOccurrencesOfString:@" " withString:@""];
Ini harus melakukannya ...
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:@" "];
Opsi lain untuk regex adalah RegexKitLite , yang sangat mudah disematkan dalam proyek iPhone:
[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
Berikut adalah potongan dari NSString
ekstensi, di mana "self"
adalah NSString
contoh. Ini dapat digunakan untuk menciutkan whitespace yang bersebelahan menjadi satu spasi dengan meneruskan [NSCharacterSet whitespaceAndNewlineCharacterSet]
dan ' '
ke dua argumen.
- (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;
}
Solusi alternatif: dapatkan salinan OgreKit (pustaka ekspresi reguler Cocoa).
Seluruh fungsinya kemudian:
NSString *theStringTrimmed =
[theString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression *regex =
[OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);
Pendek dan manis.
Jika Anda mencari solusi tercepat, serangkaian instruksi yang dibuat dengan hati-hati menggunakan NSScanner
mungkin akan bekerja paling baik tetapi itu hanya diperlukan jika Anda berencana untuk memproses blok teks yang besar (banyak megabyte).
menurut @Mathieu Godart adalah jawaban terbaik, tetapi beberapa baris hilang, semua jawaban hanya mengurangi spasi antar kata, tetapi ketika jika memiliki tab atau memiliki tab di ruang tempat, seperti ini: "ini adalah teks \ t, dan \ tTab di antara, seterusnya "dalam kode tiga baris kita akan: string yang ingin kita kurangi spasi putih
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]];
hasilnya adalah
"this is text , and Tab between , so on"
tanpa mengganti tab, hasilnya akan menjadi:
"this is text , and Tab between , so on"
Anda juga dapat menggunakan argumen while yang sederhana. Tidak ada keajaiban RegEx di sana, jadi mungkin lebih mudah untuk memahami dan mengubahnya di masa mendatang:
while([yourNSStringObject replaceOccurrencesOfString:@" "
withString:@" "
options:0
range:NSMakeRange(0, [yourNSStringObject length])] > 0);
Mengikuti dua ekspresi reguler akan berfungsi tergantung pada persyaratan
Kemudian terapkan metode instance nsstring stringByReplacingOccurrencesOfString:withString:options:range:
untuk menggantinya dengan satu spasi.
misalnya
[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];
Catatan: Saya tidak menggunakan pustaka 'RegexKitLite' untuk fungsionalitas di atas untuk iOS 5.x dan di atasnya.