พิจารณาตัวอย่างต่อไปนี้:
" Hello this is a long string! "
ฉันต้องการแปลงเป็น:
"Hello this is a long string!"
พิจารณาตัวอย่างต่อไปนี้:
" Hello this is a long string! "
ฉันต้องการแปลงเป็น:
"Hello this is a long string!"
คำตอบ:
ใช้โซลูชัน regexpดั้งเดิมที่จัดทำโดย hfossli
ใช้ไลบรารี regexp ที่คุณชื่นชอบหรือใช้ Cocoa-native solution ต่อไปนี้:
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!"
รูปแบบ regex ทางเลือกที่เป็นไปได้:
[ ]+
[ \\t]+
\\s+
ความง่ายในการขยายประสิทธิภาพบรรทัดจำนวนโค้ดและจำนวนอ็อบเจ็กต์ที่สร้างขึ้นทำให้โซลูชันนี้เหมาะสม
stringByReplacingOccurrencesOfString:
. ไม่อยากจะเชื่อเลยว่าฉันไม่รู้
จริงๆแล้วมีวิธีง่ายๆในการแก้ไข:
NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
( ที่มา )
ด้วย regex แต่ไม่จำเป็นต้องใช้กรอบภายนอกใด ๆ :
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 *theString = @" Hello this is a long string! ";
while ([theString rangeOfString:@" "].location != NSNotFound) {
theString = [theString stringByReplacingOccurrencesOfString:@" " 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 (ไลบรารีนิพจน์ทั่วไปของ Cocoa)
จากนั้นฟังก์ชั่นทั้งหมดคือ:
NSString *theStringTrimmed =
[theString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression *regex =
[OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);
สั้นและหวาน
หากคุณต้องการวิธีแก้ปัญหาที่เร็วที่สุดชุดคำแนะนำที่สร้างขึ้นอย่างรอบคอบโดยใช้NSScanner
อาจจะได้ผลดีที่สุด แต่จำเป็นก็ต่อเมื่อคุณวางแผนที่จะประมวลผลบล็อกข้อความขนาดใหญ่ (หลายเมกะไบต์)
อ้างอิงจาก @Mathieu Godart เป็นคำตอบที่ดีที่สุด แต่มีบางบรรทัดขาดหายไปคำตอบทั้งหมดเพียงแค่ลดช่องว่างระหว่างคำ แต่ถ้ามีแท็บหรือมีแท็บอยู่ในช่องว่างเช่นนี้: "นี่คือข้อความ \ t และ \ t แท็บระหว่าง, "ในโค้ดสามบรรทัดเราจะ: สตริงที่เราต้องการลดช่องว่างสีขาว
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"
โดยไม่ต้องเปลี่ยนแท็บ resul จะเป็น:
"this is text , and Tab between , so on"
คุณยังสามารถใช้อาร์กิวเมนต์ while ไม่มีเวทมนตร์ RegEx อยู่ในนั้นดังนั้นอาจจะเข้าใจง่ายขึ้นและเปลี่ยนแปลงได้ในอนาคต:
while([yourNSStringObject replaceOccurrencesOfString:@" "
withString:@" "
options:0
range:NSMakeRange(0, [yourNSStringObject length])] > 0);
การทำตามสองนิพจน์ทั่วไปจะได้ผลขึ้นอยู่กับข้อกำหนด
จากนั้นใช้วิธีการอินสแตนซ์ของ nsstring stringByReplacingOccurrencesOfString:withString:options:range:
เพื่อแทนที่ด้วยช่องว่างสีขาวเดียว
เช่น
[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];
หมายเหตุ: ฉันไม่ได้ใช้ไลบรารี 'RegexKitLite' สำหรับฟังก์ชันข้างต้นสำหรับ iOS 5.x ขึ้นไป