玩转NSString(不信你看)

Objective-C里核心的处理字符串的类就是NSString和NSMutableString这两个类,这两个类完成了Objective-C中字符串大部分功能的处理

NSString


字符串属性

1
2
3
4
5
6
7
8
9
10
11
    //////////字符串属性//////////
    NSString *str1 = @"string";
    
    NSLog(@"长度:                   %ld", str1.length);
NSLog(@"描述:                   %@", string.description);
    NSLog(@"哈希地址:                %lu", (unsigned long)string.hash);
    NSLog(@"字符串对应下标字符:        %c", [str1 characterAtIndex:2]);
    //输出:   长度:                   6
    //输出:   描述:                   string
  //输出:   哈希地址:              10152471993823965
    //输出:   字符串对应下标字符:        r

字符串截取

1
2
3
4
5
6
7
8
//截取指定位置之后的字符串
- (NSString *)substringFromIndex:(NSUInteger)from;
//从0下标开始截取到指定位置的字符串
- (NSString *)substringToIndex:(NSUInteger)to;
//截取指定范围的字符串
- (NSString *)substringWithRange:(NSRange)range;
//截取字符串指定范围的字符
- (void)getCharacters:(unichar *)buffer range:(NSRange)range;

字符串比较

将两个字符串进行计较,返回NSComparisonResult枚举结果

比较结果:
NSComparisonResult 说明
NSOrderedAscending 升序 (左小右大)
NSOrderedSame 相同 (内容相同)
NSOrderedDescending 降序 (左大右小)
比较选项:
NSStringCompareOptions 说明
NSCaseInsensitiveSearch 不区分大小写比较
NSLiteralSearch 区分大小写比较
NSBackwardsSearch 从字符串末尾开始搜索
NSAnchoredSearch 搜索限制范围的字符串
NSNumericSearch 按照字符串里的数字为依据,算出顺序
NSDiacriticInsensitiveSearch 忽略 “-“ 符号的比较
NSWidthInsensitiveSearch 忽略字符串的长度,比较出结果
NSForcedOrderingSearch 忽略不区分大小写比较的选项
NSRegularExpressionSearch 只能应用于 rangeOfString:…, stringByReplacingOccurrencesOfString:…和 replaceOccurrencesOfString:…方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   //////////字符串比较//////////
//1.比较
- (NSComparisonResult)compare:(NSString *)string;
//2.比较(指定字符串,条件)
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
//3.比较(指定字符串,条件,范围)
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange;
//4.比较(指定字符串,条件,范围,本地化)
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange locale:(nullable id)locale;
//5.比较(不区分大小写)
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;

//6.本地化比较
- (NSComparisonResult)localizedCompare:(NSString *)string;
//7.本地化比较(不区分大小写)
- (NSComparisonResult)localizedCaseInsensitiveCompare:(NSString *)string;
//8.本地化比较(标准)
- (NSComparisonResult)localizedStandardCompare:(NSString *)string;

//9.判断两个字符串是否内容一致
- (BOOL)isEqualToString:(NSString *)aString;

字符串搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
   //////////搜索基本//////////
//1.是否包含前缀(以str开头)
- (BOOL)hasPrefix:(NSString *)str;
//2.是否包含后缀(以str结尾)
- (BOOL)hasSuffix:(NSString *)str;
//3.获取公共前缀
- (NSString *)commonPrefixWithString:(NSString *)str options:(NSStringCompareOptions)mask;
//4.是否包含字符串
- (BOOL)containsString:(NSString *)str;
//5.本地化是否包含字符串(不区分大小写)
- (BOOL)localizedCaseInsensitiveContainsString:(NSString *)str;
//6.本地化是否包含字符串(标准)
- (BOOL)localizedStandardContainsString:(NSString *)str;
//7.本地化搜索字符串范围(标准)
- (NSRange)localizedStandardRangeOfString:(NSString *)str;

//////////搜索字符串//////////
//8.搜索(指定字符串)
- (NSRange)rangeOfString:(NSString *)searchString;
//9.搜索(指定字符串,条件)
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;
//10.搜索(指定字符串,条件,范围)
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)searchRange;
//11.搜索(指定字符串,条件,范围,本地化)
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)searchRange locale:(nullable NSLocale *)locale;

//////////搜索字符集合//////////
//12.搜索(指定字符集合)
- (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet;
//13.搜索(指定字符集合,条件)
- (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet options:(NSStringCompareOptions)mask;
//14.搜索(指定字符集合,条件,范围)
- (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet options:(NSStringCompareOptions)mask range:(NSRange)searchRange;

//15.用字符串的字符编码指定索引查找位置
- (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index;
//16.用字符串的字符编码指定区域段查找位置
- (NSRange)rangeOfComposedCharacterSequencesForRange:(NSRange)range;

字符串拼接

1
2
3
4
5
6
7
8
9
10
    //////////字符串拼接//////////
    NSString *string = @"1";
    NSString *appStr = @"2";
    NSString *resultStr1 = [string stringByAppendingString:appStr];
    NSString *resultStr2 = [string stringByAppendingFormat:@" + %@", appStr];
    
    NSLog(@"普通拼接:     %@", resultStr1);
    NSLog(@"格式化拼接:   %@", resultStr2);
    //输出:   普通拼接:     12
    //输出:   格式化拼接:   1 + 2

字符串基本类型转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    //////////字符串基本类型转换//////////
    NSString *numStr = @"87234.2345";

    NSLog(@"double型:        %f", numStr.doubleValue);
    NSLog(@"float型:         %f", numStr.floatValue);
    NSLog(@"int型:           %d", numStr.intValue);
    NSLog(@"NSInteger型:     %ld", numStr.integerValue);
    NSLog(@"long long型:     %lld", numStr.longLongValue);
    NSLog(@"BOOL型:          %d", numStr.boolValue);
    //输出:   double型:        87234.234500
    //输出:   float型:         87234.234375
    //输出:   int型:           87234
    //输出:   NSInteger型:     87234
    //输出:   long long型:     87234
    //输出:   BOOL型:          1

字符串大小写转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    //////////字符串大小写转换//////////
    NSString *string = @"string";

    NSLog(@"大写:         %@", string.uppercaseString);
NSLog(@"小写:         %@", string.lowercaseString);
    NSLog(@"首字母大写:    %@", string.capitalizedString);
    //输出:   大写:         STRING
//输出:   小写:         string
    //输出:   首字母大写:    String

//本地化(大写)
- (NSString *)uppercaseStringWithLocale:(nullable NSLocale *)locale;
//本地化(小写)
- (NSString *)lowercaseStringWithLocale:(nullable NSLocale *)locale;
//本地化(首字母大写)
- (NSString *)capitalizedStringWithLocale:(nullable NSLocale *)locale;

字符串分行,分段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   //////////分行//////////
//1.指定范围,分行取字符串
- (void)getLineStart:(nullable NSUInteger *)startPtr end:(nullable NSUInteger *)lineEndPtr contentsEnd:(nullable NSUInteger *)contentsEndPtr forRange:(NSRange)range;
//2.获取指定范围该行的范围
- (NSRange)lineRangeForRange:(NSRange)range;

//////////分段//////////
//3.指定范围,分段取字符串
- (void)getParagraphStart:(nullable NSUInteger *)startPtr end:(nullable NSUInteger *)parEndPtr contentsEnd:(nullable NSUInteger *)contentsEndPtr forRange:(NSRange)range;
//4.获取指定范围该段落的范围
- (NSRange)paragraphRangeForRange:(NSRange)range;

//////////字符串分行,分段//////////
NSString *string = @"123 456\nABC,DEF\nabc.def";
    //获取该行的范围(指定范围)
    NSRange range1 = [string lineRangeForRange:NSMakeRange(0, 10)];
    NSLog(@"%ld 行长度:     %ld", range1.location, range1.length);
    //输出:       0 行长度:     16

    //获取该段落范围(指定范围)
    NSRange range2 = [string paragraphRangeForRange:NSMakeRange(0, 3)];
    NSLog(@"%ld 段落长度:   %ld", range2.location, range2.length);
    //输出:       0 段落长度:   8

字符串列举(按条件)

列举选项:
NSStringEnumerationOptions 说明
NSStringEnumerationByLines 按行
NSStringEnumerationByParagraphs 按段落
NSStringEnumerationByComposedCharacterSequences 按字符顺序
NSStringEnumerationByWords 按单词,字
NSStringEnumerationBySentences 按句子
NSStringEnumerationReverse 反向遍历
NSStringEnumerationSubstringNotRequired 不需要子字符串
NSStringEnumerationLocalized 本地化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//////////字符串列举//////////    
NSString *string = @"123456\nABCDEF\nabcdef
    //1.列举(按行)
   [string enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOL * _Nonnull stop) {
       NSLog(@"每行:   %@", line);
   }];
    //输出:    每行:   123456
    //输出:    每行:   ABCDEF
    //输出:    每行:   abcdef
    
 
    //2.列举(范围,条件)
    [string enumerateSubstringsInRange:NSMakeRange(5, 10) options:NSStringEnumerationByLines usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
       
        NSLog(@"%@", substring);
        NSLog(@"%ld   %ld", substringRange.location, substringRange.length);
        NSLog(@"%ld   %ld", enclosingRange.location, enclosingRange.length);
        
    }];
    //输出:   6
    //输出:   5 1
    //输出:   5 2
    
    //输出:   ABCDEF
    //输出:   7   6
    //输出:   7   7
    
    //输出:   a
    //输出:   14   1
    //输出:   14   1

字符串编码和转换

1
2
3
4
5
6
7
8
9
    //////////字符串编码和转换//////////
    NSString *string = @"string";

    NSLog(@"最快编码值(枚举):      %lu", (unsigned long)string.fastestEncoding);
    NSLog(@"最小编码值(枚举):      %lu", (unsigned long)string.smallestEncoding);
    NSLog(@"UTF8编码值:           %s", string.UTF8String);
    //输出:     最快编码值(枚举):      1
    //输出:     最小编码值(枚举):      1
    //输出:     UTF8编码值:           string
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//1.选择编码,是否允许有损编码
- (nullable NSData *)dataUsingEncoding:(NSStringEncoding)encoding allowLossyConversion:(BOOL)lossy;
//2.选择编码
- (nullable NSData *)dataUsingEncoding:(NSStringEncoding)encoding;
//3.判断是否可以无损编码
- (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding;

//4.C字符编码转换
- (nullable __strong const char *)cStringUsingEncoding:(NSStringEncoding)encoding;
//5.判读C字符转化是否可以成功
- (BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding;
//6.指定缓存区转换
- (BOOL)getBytes:(nullable void *)buffer maxLength:(NSUInteger)maxBufferCount usedLength:(nullable NSUInteger *)usedBufferCount encoding:(NSStringEncoding)encoding options:(NSStringEncodingConversionOptions)options range:(NSRange)range remainingRange:(nullable NSRangePointer)leftover;

//7.对字符串进行编码时所需的最大字节数
- (NSUInteger)maximumLengthOfBytesUsingEncoding:(NSStringEncoding)enc;
//8.对字符串进行编码时所需的字节数
- (NSUInteger)lengthOfBytesUsingEncoding:(NSStringEncoding)enc;

//9.可用字符串编码
+ (const NSStringEncoding *)availableStringEncodings;
//10.本地化编码名称
+ (NSString *)localizedNameOfStringEncoding:(NSStringEncoding)encoding;
//11.默认C字符串编码
+ (NSStringEncoding)defaultCStringEncoding;

字符串分割

######字符集合:
| NSCharacterSet | 说明 |
| ——————————– | —– |
| controlCharacterSet | 控制符 |
| whitespaceCharacterSet | 空格符 |
| whitespaceAndNewlineCharacterSet | 空格换行符 |
| decimalDigitCharacterSet | 小数 |
| letterCharacterSet | 文字 |
| lowercaseLetterCharacterSet | 小写字母 |
| uppercaseLetterCharacterSet | 大写字母 |
| nonBaseCharacterSet | 非基础 |
| alphanumericCharacterSet | 数字字母 |
| decomposableCharacterSet | 可分解 |
| illegalCharacterSet | 非法 |
| punctuationCharacterSet | 标点 |
| capitalizedLetterCharacterSet | 大写 |
| symbolCharacterSet | 符号 |
| newlineCharacterSet | 换行符 |

1
2
3
4
5
6
7
8
9
10
11
12
    //////////字符串分割//////////
    NSString *string = @"A_B_c_D_E_F";
    
    //分割(指定字符串)
    NSArray *resultArr1 = [string componentsSeparatedByString:@"_"];
    NSLog(@"%@", resultArr1);
    //输出:   (A, B, c, D, E, F)

    //分割(指定字符集合)
    NSArray *resultArr2 = [string componentsSeparatedByCharactersInSet:[NSCharacterSet lowercaseLetterCharacterSet]];
    NSLog(@"%@", resultArr2);    
    //输出:   ("A_B_" , "_D_E_F")

字符串操作(修剪,填充,折叠,替换)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    NSString *string = @"3EWRs a;af";
  
    //////////修剪//////////
    NSString *result1 = [string stringByTrimmingCharactersInSet:[NSCharacterSet lowercaseLetterCharacterSet]];
    NSLog(@"%@", result1);
    //输出:   3EWRs a;
    
    
    //////////填充//////////
    NSString *result2 = [string stringByPaddingToLength:20 withString:@"填充" startingAtIndex:1];
    NSLog(@"%@", result2);
    //输出:   3EWRs a;af充填充填充填充填充填
    
    
    //////////折叠//////////
    NSString *result3 = [string stringByFoldingWithOptions:NSNumericSearch locale:[NSLocale systemLocale]];
    NSLog(@"%@", result3);
    //输出:   3EWRs a;af
    
    
    //////////替换//////////
    //替换(指定字符串)
    NSString *result4 = [string stringByReplacingOccurrencesOfString:@" " withString:@"替换"];
    NSLog(@"%@", result4);
    //输出:   3EWRs替换a;af
    

    //替换(指定字符串,条件,范围)
    NSString *result5 = [string stringByReplacingOccurrencesOfString:@"a" withString:@"替换" options:NSRegularExpressionSearch range:NSMakeRange(0, string.length - 2)];
    NSLog(@"%@", result5);
    //输出:   3EWRs 替换;af
    
    
    //替换(指定范围)
    NSString *result6 = [string stringByReplacingCharactersInRange:NSMakeRange(0, string.length) withString:@"替换"];
    NSLog(@"%@", result6);
    //输出:   替换

字符串翻译

######翻译选项:

翻译选择 说明
NSStringTransformLatinToKatakana 拉丁->片假名
NSStringTransformLatinToHiragana 拉丁->平假名
NSStringTransformLatinToHangul 拉丁->韩语
NSStringTransformLatinToArabic 拉丁->阿拉伯语
NSStringTransformLatinToHebrew 拉丁->希伯来语
NSStringTransformLatinToThai 拉丁->泰国
NSStringTransformLatinToCyrillic 拉丁->西里尔字母
NSStringTransformLatinToGreek 拉丁->希腊
NSStringTransformToLatin 拉丁
NSStringTransformMandarinToLatin 普通话->拉丁
NSStringTransformHiraganaToKatakana 平假名->片假名
NSStringTransformFullwidthToHalfwidth 全角->半角
NSStringTransformToXMLHex XML16进制
NSStringTransformToUnicodeName Unicode名
NSStringTransformStripCombiningMarks 结合地带商标
NSStringTransformStripDiacritics 带音符
1
2
3
4
5
6
    //////////字符串翻译//////////
    NSString *dalian = @"大连";
    NSString *result = [dalian stringByApplyingTransform:NSStringTransformMandarinToLatin reverse:NO];
    
    NSLog(@"%@", result);
    //输出:   dà lián

字符串写入

1
2
3
4
5
6
    //////////字符串写入//////////
    //写入到指定路径,编码的文件中
    [string writeToFile:@"/Users/Desktop/LuisX.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
    //写入到指定URL,编码的文件中
    [string writeToURL:[NSURL URLWithString:@"file://LuisX.text"] atomically:YES encoding:NSUTF8StringEncoding error:nil];

NSMutableString

继承自NSString
NSString中的方法在NSMutableString都可以使用
NSMutableString是动态的字符串,可以动态的添加,修改,删除等

可变字符串分配容量

提前指定的容量,知识用于内存优化,实际大小可以大于设置的容量capacity

1
2
3
4
5
6
7
   //////////字符串分配容量//////////
    
   //1.初始化容量为Capacity大小的字符串 (需要手动释放内存)
   NSMutableString *mutableStr1 = [[NSMutableString alloc] initWithCapacity:20];
    
   //2.初始化容量为Capacity大小的字符串 (不需要手动释放内存)
   NSMutableString *mutableStr2 = [NSMutableString stringWithCapacity:20];

可变字符串扩展方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    NSMutableString *str = [NSMutableString stringWithString:@"string"];
    
    //////////插入//////////
    [str insertString:@"123" atIndex:2];
    NSLog(@"%@", str);
    //输出:   st123ring
    
    
    //////////删除//////////
    [str deleteCharactersInRange:NSMakeRange(2, 2)];
    NSLog(@"%@", str);
    //输出:   st3ring
    
    
    //////////拼接//////////
    [str appendString:@"456"];
    NSLog(@"%@", str);
    //输出:   st3ring456
    
    
    //////////格式化拼接//////////
    [str appendFormat:@"7 89"];
    NSLog(@"%@", str);
    //输出:   st3ring4567 89
    
    
    //////////设置新字符串//////////
    [str setString:@"string"];
    NSLog(@"%@", str);
    //输出:   string

    //////////字符串替换//////////
    //1.指定范围替换
    [str1 replaceCharactersInRange:NSMakeRange(2, 2) withString:@"123"];
    NSLog(@"%@", str1);
    //输出:   st123ng
    
    
    //2.指定字符串,条件,范围替换
    [str1 replaceOccurrencesOfString:@"123" withString:@"--" options:NSRegularExpressionSearch range:NSMakeRange(0, str1.length)];
    NSLog(@"%@", str1);
    //输出:   st--ng