投稿文章,作者:會跳舞的獅子(微博)
這篇文章主要詳細介紹iOS中字符串的各種用法,如果發現不夠完善可以提交意見,主要是方便對字符串的使用的理解,內容比較多但是詳細,如果覺得以後用得著的地方可以先收藏著。
NSString的基本概念 (NSString是不可變字符串)
什麼是NSString?
一個NSString代表一個字符串(文字內容)
一般稱NSString為字符串類
NSString的創建方式 (兩種)
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event { // [self create1]; [self create2]; } /** 第一種創建方式 */ //常量區中的字符串只要內容一致, 不會重復創建 - (void)create1 { NSString *str1 = @"lion"; NSString *str2 = @"lion"; //輸出地址不一樣 NSLog(@"\n %p \n %p",&str1,&str2); } /** 第二種創建方式 */ //堆區中得字符串哪怕內容一致, 也會重復創建 - (void)create2 { //stringWithFormat 可以進行拼接 NSString *str1 = [NSString stringWithFormat:@"lion"]; NSString *str2 = [NSString stringWithFormat:@"lion"]; //輸出地址相同 NSLog(@"\n %p \n %p",str1,str2); }
NSString的讀寫
讀取:
// 用來保存錯誤信息 NSError *error = nil; // 讀取文件內容 NSString *str = [NSString stringWithContentsOfFile:@"/Users/LJH/Desktop/Lion.txt" encoding:NSUTF8StringEncoding error:&error]; // 如果有錯誤信息 if (error) { NSLog(@"讀取失敗, 錯誤原因是:%@", [error localizedDescription]); } else { // 如果沒有錯誤信息 NSLog(@"讀取成功, 文件內容是:\n%@", str); }
寫入:
// writeToFile 寫入 NSString *str = @"Lion"; BOOL flag = [str writeToFile:@"/Users/LJH/Desktop/Lion.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil]; if (flag == 1) { NSLog(@"寫入成功"); } //注意: 重復寫入同一個文件會覆蓋上一個文件
字符串的比較
NSString的大小寫屬性
全部字符轉為大寫字母
- (NSString *)uppercaseString;
全部字符轉為小寫字母
- (NSString *)lowercaseString
首字母變大寫,其他字母都變小寫
- (NSString *)capitalizedString
NSString的比較
one:
- (BOOL)isEqualToString:(NSString *)aString; 兩個字符串的內容相同就返回YES, 否則返回NO NSString *str1 = @"lion"; NSString *str2 = [NSString stringWithFormat:@"lion"]; if ([str1 isEqualToString:str2]) { NSLog(@"字符串內容一樣"); } if (str1 == str2) { NSLog(@"字符串地址一樣"); }
two:
- (NSComparisonResult)compare:(NSString *)string;
這個方法可以用來比較兩個字符串內容的大小
比較方法: 逐個字符地進行比較ASCII值,返回NSComparisonResult作為比較結果
NSComparisonResult是一個枚舉,有3個值:
如果左側 > 右側,返回NSOrderedDescending,
如果左側 < 右側,返回NSOrderedAscending,
如果左側 == 右側返回NSOrderedSame
NSString *str1 = @"abc"; NSString *str2 = @"abd"; switch ([str1 compare:str2]) { case NSOrderedAscending: NSLog(@"後面一個字符串大於前面一個"); break; case NSOrderedDescending: NSLog(@"後面一個字符串小於前面一個"); break; case NSOrderedSame: NSLog(@"兩個字符串一樣"); break; }
輸出結果: 後面一個字符串大於前面一個
three:
- (NSComparisonResult) caseInsensitiveCompare:(NSString *)string;
忽略大小寫進行比較,返回值與compare:一致
字符串搜索
- (BOOL)hasPrefix:(NSString *)aString;
是否以aString開頭
- (BOOL)hasSuffix:(NSString *)aString;
是否以aString結尾
- (NSRange)rangeOfString:(NSString *)aString;
用來檢查字符串內容中是否包含了aString
如果包含, 就返回aString的范圍
如果不包含, NSRange的location為NSNotFound, length為0
NSRange基本概念
NSRange是Foundation框架中比較常用的結構體, 它的定義如下:
typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; // NSUInteger的定義 typedef unsigned int NSUInteger;
NSRange用來表示事物的一個范圍,通常是字符串裡的字符范圍或者數組裡的元素范圍
NSRange有2個成員
NSUInteger location : 表示該范圍的起始位置
NSUInteger length : 表示該范圍內的長度
比如@“I Miss You Lion”中的@“Lion”可以用location為11,length為4的范圍來表示
NSRange的創建
有3種方式創建一個NSRange變量
方式1
NSRange range; range.location = 11; range.length = 4;
方式2
NSRange range = {11, 4};
或者
NSRange range = {.location = 11,.length = 4};
方式3 : 使用NSMakeRange函數
NSRange range = NSMakeRange(11, 4);
字符串的截取
one:
- (NSString *)substringFromIndex:(NSUInteger)from;
從指定位置from開始(包括指定位置的字符)到尾部
- (void)subFrom { //字符從0開始算 NSString *str = @"會跳舞的獅子"; str = [str substringFromIndex:6]; NSLog(@"str = %@", str); //打印結果 str = 會跳舞的獅子 }
two:
- (NSString *)substringToIndex:(NSUInteger)to;
從字符串的開頭一直截取到指定的位置to,但不包括該位置的字符
- (void)subTo { NSString *str = @"會跳舞的獅子"; str = [str substringToIndex:12]; NSLog(@"str = %@", str); //打印結果 str = 會跳舞的獅子 }
three:
- (NSString *)substringWithRange:(NSRange)range;
按照所給出的NSRange從字符串中截取子串
- (void)subWithRange { NSString *str = @"會跳舞的獅子"; NSRange range; /* range.location = 6; range.length = 6; */ range.location = [str rangeOfString:@">"].location + 1; range.length = [str rangeOfString:@""].location - range.location; NSString *result = [str substringWithRange:range]; NSLog(@"result = %@", result); //打印結果 會跳舞的獅子 }
字符串的替換
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;
用replacement替換target
- (void)Replacing { NSString *str = @"http:**www.baidu.com*lion.png"; NSString *newStr = [str stringByReplacingOccurrencesOfString:@"*" withString:@"/"]; NSLog(@"newStr = %@", newStr); } - (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
去除首尾
- (void)Trimming { NSString *str = @" http://baidu.com/lion.png "; //去除首尾的空格 NSString *newStr = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; NSLog(@"str =|%@|", str); NSLog(@"newStr =|%@|", newStr); /* 打印結果 str =| http://baidu.com/lion.png | newStr =|http://baidu.com/lion.png| */ }
字符串與路徑
NSString 與 路徑
one:
- (BOOL)isAbsolutePath; //是否為絕對路徑 - (void)isAbsolutePath { // 其實就是判斷是否以/開頭 NSString *str = @"/Users/LJH/Desktop/Lion.txt"; NSString *str = @"Users/LJH/Desktop/Lion.txt"; if ([str isAbsolutePath]) { NSLog(@"是絕對路徑"); }else { NSLog(@"不是絕對路徑"); } }
two:
- (NSString *)lastPathComponent; 獲得最後一個目錄 - (void)lastPathComponent { // 截取最後一個/後面的內容 NSString *str = @"/Users/LJH/Desktop/Lion.txt"; NSString *component = [str lastPathComponent]; NSLog(@"component = %@", component); }
three:
- (NSString *)stringByDeletingLastPathComponent; 刪除最後一個目錄 - (void)stringByDeletingLastPathComponent { // 其實就是上次最後一個/和之後的內容 NSString *str = @"/Users/LJH/Desktop/Lion.txt"; NSString *newStr = [str stringByDeletingLastPathComponent]; NSLog(@"newStr = %@", newStr); //打印結果:newStr = /Users/LJH/Desktop }
four:
- (NSString *)stringByAppendingPathComponent:(NSString *)str;在路徑的後面拼接一個目錄 (也可以使用stringByAppendingString:或者stringByAppendingFormat:拼接字符串內容) - (void)stringByAppendingPathComponent { // 其實就是在最後面加上/和要拼接得內容 // 注意會判斷後面有沒有/有就不添加了, 沒有就添加, 並且如果有多個會替換為1個 // NSString *str = @"/Users/NJ-Lee/Desktop"; NSString *str = @"/Users/LJH/Desktop/"; NSString *newStr = [str stringByAppendingPathComponent:@"Lion"]; NSLog(@"newStr = %@", newStr); //打印結果:newStr = /Users/LJH/Desktop/Lion }
NSString 與 文件拓展名
- (void)pathExtension { one: - (NSString *)pathExtension; 獲得拓展名 // 其實就是從最後面開始截取.之後的內容 // NSString *str = @"Lion.txt"; NSString *str = @"abc.Lion.txt"; NSString *extension = [str pathExtension]; NSLog(@"extension = %@", extension); //打印結果:extension = txt } two: - (NSString *)stringByDeletingPathExtension; 刪除尾部的拓展名 - (void)stringByDeletingPathExtension { // 其實就是上次從最後面開始.之後的內容 NSString *str = @"love.Lion.txt"; NSString *newStr = [str stringByDeletingPathExtension]; NSLog(@"newStr = %@", newStr); //打印結果 newStr = love.Lion } three: - (NSString *)stringByAppendingPathExtension:(NSString *)str; 在尾部添加一個拓展名 - (void)stringByAppendingPathExtension { // 其實就是在最後面拼接上.和指定的內容 NSString *str = @"Lion"; NSString *newStr = [str stringByAppendingPathExtension:@"png"]; NSLog(@"newStr = %@", newStr); //打印結果: newStr = Lion.png }
字符串與基本數據類型的轉換
- (NSUInteger)length;
返回字符串的長度(有多少個文字)
- (unichar)characterAtIndex:(NSUInteger)index;
返回index位置對應的字符
轉為基本數據類型
- (double)doubleValue; - (float)floatValue; - (int)intValue; NSString *str1 = @"22"; NSString *str2 = @"22"; int res = str1.intValue + str2.intValue; NSLog(@"res = %i", res); NSString *str1 = @"22"; NSString *str2 = @"22.2"; double res = str1.doubleValue + str2.doubleValue; NSLog(@"res = %f", res);
轉為C語言中的字符串
- (char *)UTF8String; NSString *str = @"love"; const char *cStr = [str UTF8String]; NSLog(@"cStr = %s", cStr); char *cStr = "love"; NSString *str = [NSString stringWithUTF8String:cStr]; NSLog(@"str = %@", str); 將一個字符串分隔成多個字符串 // 將一個字符串分隔成多個字符串 //- (NSArray *)componentsSeparatedByString:(NSString *)separator - (void)componentsSeparatedByString { // 假如有一個字符串 NSString *list = @"java,oc,c,swift"; // 可以用上面的函數得到一個字符串數組: NSArray *listItems = [list componentsSeparatedByString:@","]; // 這個數組就是把原來的字符串用","分割得到的多個字符串: //所以如果用這個方法就可以將字符串分隔多個字符串,然後存放到數組裡面,在數組中取出想要的字符串 NSLog(@"%@",listItems); //打印結果見下: /* 2016-05-30 11:09:22.337 NSString的基本使用[1277:56593] ( java, oc, c, swift ) */ }
NSMutableString的用法 (NSMutableString是可變字符串)
NSMutableString的基本概念
NSMutableString 類 繼承NSString類,那麼NSString供的方法在NSMutableString中基本都可以使用,NSMutableString好比一個字符串鏈表,它可以任意的動態在字符串中添加字符 串 刪除字符串 指定位置插入字符串,使用它來操作字符串會更加靈活。
NSMutableString和NSString的區別
NSString是不可變的, 裡面的文字內容是不能進行修改的 + NSMutableString是可變的, 裡面的文字內容可以隨時更改
NSMutableString能使用NSString的所有方法
字符串中的可變和不可變
不可變:指的是字符串在內存中占用的存儲空間固定,並且存儲的內容不能發生變化
- (void)str { // 改變了指針的指向, 並沒有修改字符串 NSString *str = @"lion"; str = @"Lion"; // 生成了一個新的字符串, 並沒有修改字符串 NSString *newStr = [str substringFromIndex:1]; NSLog(@"str = %@", str); NSLog(@"newStr = %@", newStr); }
可變:指的是字符串在內存中占用的存儲空間可以不固定,並且存儲的內容可以被修改
- (void)strM { //可變的不能賦值給不可變的 //只有不可變的才能賦值給可變的 NSString *str = nil; NSMutableString *strM = [NSMutableString string]; NSLog(@"strM = %@", strM); // 修改原有字符串, 沒有生成新的字符串 [strM appendString:@"Lion"]; NSLog(@"strM = %@", strM); [strM appendString:@" love you "]; NSLog(@"strM = %@", strM); str = strM; NSLog(@"str = %@",str); }
NSMutableString常用方法
one:
- (void)appendString:(NSString *)aString; 拼接aString到最後面 - (void)appendFormat:(NSString *)format, ...; 拼接一段格式化字符串到最後面 - (void)appendStrM { NSMutableString *strM = [NSMutableString string]; NSLog(@"strM = %@", strM); [strM appendString:@"Lion"]; NSLog(@"strM = %@", strM); }
two:
- (void)deleteCharactersInRange:(NSRange)range; 刪除range范圍內的字符串 - (void)deleteCharactersInRange { NSMutableString *strM = [NSMutableString stringWithString:@"http://www.baidu.com"]; // 一般情況下利用rangeOfString和deleteCharactersInRange配合刪除指定內容 NSRange range = [strM rangeOfString:@"http://"]; [strM deleteCharactersInRange:range]; NSLog(@"strM = %@", strM); //打印內容: strM = www.baidu.com }
three:
- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc; 在loc這個位置中插入aString - (void)insertString { NSMutableString *strM = [NSMutableString stringWithString:@"www.baidu.com"]; [strM insertString:@"http://" atIndex:0]; NSLog(@"strM = %@", strM); //打印內容: strM = http://www.baidu.com }
four:
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString; 使用aString替換range范圍內的字符串 - (void)replaceOccurrencesOfString { NSMutableString *strM = [NSMutableString stringWithString:@"http://www.baidu.com/lion.png"]; NSRange range = [strM rangeOfString:@"lion"]; [strM replaceOccurrencesOfString:@"lion" withString:@"super Man" options:0 range:range]; NSLog(@"strM = %@", strM); //打印內容:strM = http://www.baidu.com/super Man.png }