NSCharacterSet代表一個(gè)字符的集合蠢正,它通常結(jié)合NSString桩了、NSScanner使用芬迄。
使用場(chǎng)景
這邊介紹兩個(gè)NSCharacter結(jié)合NSString的使用場(chǎng)景攒庵。
在此之前校摩,先來(lái)介紹一下NSString中兩個(gè)跟NSCharacterSet有關(guān)的方法:
//根據(jù)字符集來(lái)清理字符串兩端的字符
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
//根據(jù)字符集separator來(lái)分割字符串
- (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator;
例子1
實(shí)現(xiàn)功能:
清除字符串兩端的數(shù)字
代碼我們可以這樣寫:
NSString *string = @"123abc123";
string = [string stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];
NSLog(@"%@",string);
打印結(jié)果是:
abc
例子2
實(shí)現(xiàn)功能:
清除字符串"Lorem ipsum dolar sit amet."中多余的空格
代碼我們可以這樣寫:
NSString *string = @"Lorem ipsum dolar sit amet.";
string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSArray *components = [string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
components = ({
NSMutableArray *mArr = [NSMutableArray new];
for (NSString *str in components) {
if ([str isEqualToString:@""] == NO) {
[mArr addObject:str];
}
}
mArr;
});
string = [components componentsJoinedByString:@" "];
NSLog(@"%@",string);
打印結(jié)果是:
Lorem ipsum dolar sit amet.
補(bǔ)充
此處我只是列舉了兩個(gè)可能的使用場(chǎng)景芳撒,具體的需要結(jié)合實(shí)際需求來(lái)決定實(shí)現(xiàn)方案邓深。
另外例子2中,重組字符串的代碼還可以這樣寫:
components = [components filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self <> ''"]];
NSCharacterSet
說(shuō)完NSCharacterSet的使用場(chǎng)景笔刹,接著來(lái)介紹一下NSCharacterSet的方法
系統(tǒng)提供的常用字符集初始化類方法
[NSCharacterSet controlCharacterSet]; 控制字符芥备,包括換行符(\n)、制表符(\t)等舌菜,具體有哪些萌壳,不清楚
[NSCharacterSet whitespaceCharacterSet]; 空格符
[NSCharacterSet whitespaceAndNewlineCharacterSet]; 空格符、換行符
[NSCharacterSet decimalDigitCharacterSet]; 數(shù)字字符日月,0-9
[NSCharacterSet letterCharacterSet]; 字母字符
[NSCharacterSet lowercaseLetterCharacterSet]; 小寫字母字符
[NSCharacterSet uppercaseLetterCharacterSet]; 大寫字母字符
[NSCharacterSet nonBaseCharacterSet];
[NSCharacterSet alphanumericCharacterSet]; 字母袱瓮、數(shù)字字符
[NSCharacterSet decomposableCharacterSet];
[NSCharacterSet illegalCharacterSet];
[NSCharacterSet punctuationCharacterSet]; 標(biāo)點(diǎn)符號(hào)字符,指在用于分隔文字的符號(hào)
[NSCharacterSet capitalizedLetterCharacterSet];
[NSCharacterSet symbolCharacterSet]; 符號(hào)字符爱咬,除了標(biāo)點(diǎn)符號(hào)之外尺借,例如¥、$這樣的符號(hào)
[NSCharacterSet newlineCharacterSet]; 換行字符
在這其中精拟,controlCharacterSet燎斩、nonBaseCharacterSet、decomposableCharacterSet蜂绎、illegalCharacterSet栅表、capitalizedLetterCharacterSet這幾個(gè),我都不理解师枣,有明白的朋友希望不吝賜教怪瓶。
uppercaseLetterCharacterSet與capitalizedLetterCharacterSet
在stackoverflow上找到了一個(gè)問題,其中談及了uppercaseLetterCharacterSet與capitalizedLetterCharacterSet的關(guān)系坛吁,傳送門
According to the docs, +capitalizedLetterCharacterSet contains the Titlecase category, whereas +uppercaseLetterCharacterSet contains Uppercase and Titlecase.
capitalizedLetterCharacterSet包含Titlecase劳殖,而uppercaseLetterCharacterSet包含Uppercase和Titlecase铐尚,簡(jiǎn)而言之,capitalizedLetterCharacterSet是uppercaseLetterCharacterSet的子集宣增。
自定義初始化方法
//通過(guò)范圍初始化NSCharacterSet,此處的range指的是unicode在碼表上的范圍
+ (NSCharacterSet *)characterSetWithRange:(NSRange)aRange;
//通過(guò)字符串初始化NSCharacterSet
+ (NSCharacterSet *)characterSetWithCharactersInString:(NSString *)aString;
//通過(guò)二進(jìn)制數(shù)據(jù)初始化NSCharacterSet
+ (NSCharacterSet *)characterSetWithBitmapRepresentation:(NSData *)data;
//通過(guò)文件初始化NSCharacterSet
+ (nullable NSCharacterSet *)characterSetWithContentsOfFile:(NSString *)fName;
這里用實(shí)際代碼說(shuō)明一下characterSetWithRange的使用
//生成一個(gè)包含字符'a'~'z'的字符集
NSRange lcEnglishRange;
NSCharacterSet *lcEnglishLetters;
lcEnglishRange.location = (unsigned int)'a';
lcEnglishRange.length = 26;
lcEnglishLetters = [NSCharacterSet characterSetWithRange:lcEnglishRange];
屬性
//字符集的二進(jìn)制數(shù)據(jù)矛缨,用于傳輸爹脾、歸檔灵妨、保存成文件
@property (readonly, copy) NSData *bitmapRepresentation;
//一個(gè)除了數(shù)字字符之外的所有字符的字符集
[[NSCharacterSet decimalDigitCharacterSet] invertedSet]
用于判斷的方法
//判斷aCharacter是否包含在字符集中
- (BOOL)characterIsMember:(unichar)aCharacter;
//功能貌似是一樣的,入?yún)⑹荱TF-32的字符朱转?夺刑??不知道這兩個(gè)方法的區(qū)別,知道的朋友不吝賜教
- (BOOL)longCharacterIsMember:(UTF32Char)theLongChar;
//判斷theOtherSet是不是自身的子集
- (BOOL)isSupersetOfSet:(NSCharacterSet *)theOtherSet;
可以用來(lái)驗(yàn)證capitalizedLetterCharacterSet是否是uppercaseLetterCharacterSet的子集
不明白的地方
- (BOOL)hasMemberInPlane:(uint8_t)thePlane;
這個(gè)貌似涉及到Unicode的知識(shí)羞海,我暫時(shí)沒研究明白,有興趣的可以,看看這篇文章傳送門。
NSMutableCharacterSet
//添加某個(gè)范圍的字符到字符集
- (void)addCharactersInRange:(NSRange)aRange;
//移除某個(gè)范圍的字符到字符集
- (void)removeCharactersInRange:(NSRange)aRange;
//添加字符串中的字符到字符集
- (void)addCharactersInString:(NSString *)aString;
//移除字符串中的字符到字符集
- (void)removeCharactersInString:(NSString *)aString;
//合并兩個(gè)字符集
- (void)formUnionWithCharacterSet:(NSCharacterSet *)otherSet;
//保留兩個(gè)字符集的集合恢恼,即兩個(gè)字符集都有的字符的集合
- (void)formIntersectionWithCharacterSet:(NSCharacterSet *)otherSet;
相關(guān)閱讀
NSHipster.cn上的一篇譯文:NSHipster-NSCharaterSet