NSCharacterSet :以及它的可变版本NSMutableCharacterSet,用面向对象的方式来表示一组Unicode字符。它经常与NSString及NSScanner组合起来使用,在不同的字符上做过滤、删除或者分割操作。NSCharacterset是无需字符集合,主要用来判断已知字符串是否包含制定字符集,而不可以用来保存字符串。
因为字符所参与的部分经常是关键代码,你在应用中使用时应该注意一些方面. Mutable character 所花的代价比不可变字符的代价要大,要花费更多的内存.使用应该注意的几个方面:
1)尽可能的少创建可变字符设置(character sets).
2)缓存character sets(到全局的早点)而不是不断重新创建character sets.
3)避免归档character sets作为对象,可以存储到character sets文件当中,归档将被复制到不同的归档文件,将导致磁盘空间的浪费.
4)当创建一个自定义sets时,不需要在创建之后进行改变,可以使用一个不可变character set作为最终的使用,可以创建一个character set文件并存储到应用中.
Creating a character set file
如果应用频繁使用自定义character set,你应该存储它作为资源文件而不是直接作为单个character set使用.你可以存储character set通过获取 bitmap representation来存储对象.
NSData *charSetRep = [finalCharacterSet bitmapRepresentation];
NSURL *dataURL = URL for character set;
NSError *error;
BOOL result = [charSetRep writeToURL:dataURL options:NSDataWritingAtomic error:&error];
文件使用.bitmap作为扩展,使用characterSetWithContentsOfFile方法获取数据.
方法了解:
@interface NSMutableCharacterSet : NSCharacterSet <NSCopying, NSMutableCopying>
- (void)addCharactersInRange:(NSRange)aRange;
- (void)removeCharactersInRange:(NSRange)aRange;
- (void)addCharactersInString:(NSString *)aString;
- (void)removeCharactersInString:(NSString *)aString;
//组合两个CharacterSet
- (void)formUnionWithCharacterSet:(NSCharacterSet *)otherSet;
- (void)formIntersectionWithCharacterSet:(NSCharacterSet *)otherSet;
- (void)invert;//反转
//控制符
+ (NSMutableCharacterSet *)controlCharacterSet;
//返回字符集包含只在空白的空格字符(U +0020)和标签(U +0009)。
+ (NSMutableCharacterSet *)whitespaceCharacterSet;
//空格和换行符,返回的字符集包含Unicode通用类别Z * U000A〜U000D和U0085。
+ (NSMutableCharacterSet *)whitespaceAndNewlineCharacterSet;
//小数
+ (NSMutableCharacterSet *)decimalDigitCharacterSet;
//返回一个字符集包含的字符类别字母和标志。
+ (NSMutableCharacterSet *)letterCharacterSet;
//返回包含字符类别中的小写字母的字符集。
+ (NSMutableCharacterSet *)lowercaseLetterCharacterSet;
//大写字母, 返回一个包含字符的字符集,大写字母和词首字母大写字母类别。
+ (NSMutableCharacterSet *)uppercaseLetterCharacterSet;
//非基础
+ (NSMutableCharacterSet *)nonBaseCharacterSet;
// 返回一个字符集包含的类别字母,标志和数字的字符。
+ (NSMutableCharacterSet *)alphanumericCharacterSet;
//可分解
+ (NSMutableCharacterSet *)decomposableCharacterSet;
//返回包含在类的非字符或还没有被定义在3.2版的Unicode标准字符集。
+ (NSMutableCharacterSet *)illegalCharacterSet;
//返回一个字符集,包含标点符号的类别中的字符。
+ (NSMutableCharacterSet *)punctuationCharacterSet;
//返回一个包含字符类的词首字母大写字母的字符集。
+ (NSMutableCharacterSet *)capitalizedLetterCharacterSet;
//符号,返回一个包含的类别的符号中的字符的字符集。
+ (NSMutableCharacterSet *)symbolCharacterSet;
//返回包含换行符的字符集。
+ (NSMutableCharacterSet *)newlineCharacterSet NS_AVAILABLE(10_5, 2_0);
//返回的字符集包含的字符的Unicode值在一个给定的范围内。
+ (NSMutableCharacterSet *)characterSetWithRange:(NSRange)aRange;
//返回一个字符集包含一个给定的字符串中的字符
+ (NSMutableCharacterSet *)characterSetWithCharactersInString:(NSString *)aString;
+ (NSMutableCharacterSet *)characterSetWithBitmapRepresentation:(NSData *)data;
+ (nullable NSMutableCharacterSet *)characterSetWithContentsOfFile:(NSString *)fName;
@end
实际应用例子:
/**
* 去掉空格
*/
-(void)testOne{
//挤压空格 假设你去掉字符串两端的多余空格之后,还想去除单词之间的多余空格.
NSString *string = @" Lorem ipsum dolar sit amet. ";
//去除头尾包含的set字符串(这里要注意了,是针对首尾哦!).Trimming(修剪,剪裁)
string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSLog(@"string:%@",string);
//string:Lorem ipsum dolar sit amet.
//根据给定的字符串分隔符separator,对字符串进行分割为子字符串.返回一个数组对象包含被分割的所有子字符串.
NSArray *components = [string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
string = [components componentsJoinedByString:@""];
NSLog(@"string:%@",string);
//string:Loremipsumdolarsitamet.
}
/**
* 找第一个大写字母,数字
*/
-(void)testTwo{
NSString *myString=@"some text in an NSString... 123 Jack";
//大写CharacterSet
NSCharacterSet *charecterSet = [NSCharacterSet uppercaseLetterCharacterSet];
NSRange letterRange = [myString rangeOfCharacterFromSet:charecterSet];
if ([myString substringWithRange:letterRange]) {
NSLog(@"%@",[myString substringWithRange:letterRange]);//N
}
//数字
NSMutableCharacterSet *decimalDigit=[NSMutableCharacterSet decimalDigitCharacterSet];
NSRange decimalDigitRange=[myString rangeOfCharacterFromSet:decimalDigit];
if ([myString substringWithRange:decimalDigitRange]) {
NSLog(@"%@",[myString substringWithRange:decimalDigitRange]);//1 对应123
}
}
/**
* 使用stringByTrimmingCharactersInSet函数过滤字符串中的特殊符号。
*/
-(void)testThree{
//1:有字符串“A~B^C_D>E",拆分出单个字母:
NSString *str =@" \nA~B^C_D>E ";
//去掉前边和后边的空格和换行符,中间部分无效.
str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSCharacterSet * charSet = [NSCharacterSet characterSetWithCharactersInString:@"^~_>"];
NSArray *arr = [str componentsSeparatedByCharactersInSet:charSet];
//输出看效果
[arr enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop) {
NSLog(@"A~B^C_D->[%@]", obj);
}];
NSLog(@"arr %@",[arr componentsJoinedByString:@""]);//arr ABCDE
//2:关于invertedSet
NSString *string =@" 123,45_6 7/8>9a ";
NSString * kNumber =@"0123456789.";
//对于自定义字符串是非常重要的,经常使用.
NSCharacterSet *numberSet = [[NSCharacterSet characterSetWithCharactersInString:kNumber]invertedSet];
//invertedSet方法是去反字符,把所有的除了kNumber里的字符都找出来(包含去空格功能),经常使用与 UITextFiled中对输入进行过滤!
NSString *fieldString = [[string componentsSeparatedByCharactersInSet:numberSet]componentsJoinedByString:@""];
NSLog(@"number:%@", fieldString); number:123456789
//3:去掉首尾指定的字符集
NSString *str=@"天我爱北京天安门天";
id cs= [NSCharacterSet characterSetWithCharactersInString:@"天门"];
NSString *strResult=[str stringByTrimmingCharactersInSet:cs];
NSLog(@"%@",strResult);//我爱北京天安
//2:去除指定的字符集
NSString *strMsg=@"我爱北京天安门";
NSCharacterSet *characterSet= [NSCharacterSet characterSetWithCharactersInString:@"天门"];
NSMutableString *theString=[NSMutableString stringWithString:strMsg];
NSString *result= [self clearnIllegitCharacters:theString andCharacterSet:characterSet];
NSLog(@"%@",result);//我爱北京安
}
// 清除敏感词语
- (NSString *)clearnIllegitCharacters:(NSMutableString *)originString andCharacterSet:(NSCharacterSet *)cs{
NSString *strResult=nil;
NSRange range2;
do {
//NSLiteralSearch表示一个一个字符进行搜索,该方法返回第一个搜索到的范围.
range2=[originString rangeOfCharacterFromSet:cs options:NSLiteralSearch];
if (range2.location!=NSNotFound) {
[originString replaceCharactersInRange:range2 withString:@""];
}
} while (range2.location!=NSNotFound);
strResult=[[NSString alloc] initWithString:originString];
return strResult;
}
typedefNS_OPTIONS(NSUInteger, NSStringCompareOptions) {
NSCaseInsensitiveSearch =1,//两个字符串的比较不区分大小写
NSLiteralSearch = 2,//两个字符串的比较区分大小写
NSBackwardsSearch =4,//从字符串末尾开发查询搜索
NSAnchoredSearch =8,//搜索有限制范围的字符串
NSNumericSearch = 64,//根据字符串里的数字来计算顺序
NSDiacriticInsensitiveSearchNS_ENUM_AVAILABLE(10_5,2_0) =128,
NSWidthInsensitiveSearch NS_ENUM_AVAILABLE(10_5,2_0) =256,//可以忽略字符串的宽度(长度)比较结果
NSForcedOrderingSearchNS_ENUM_AVAILABLE(10_5,2_0) =512,//忽略不区分大小写比较的选项
NSRegularExpressionSearchNS_ENUM_AVAILABLE(10_7,3_2) =1024
//
};
/**
* 组合多个CharacterSet
*/
-(void)testSix{
//3:组合多个
NSString *str = @" Price with tax: $250 ";
NSLog(@"String: %@", str);
// All the characters to remove
NSMutableCharacterSet *characterSet = [NSMutableCharacterSet symbolCharacterSet];
[characterSet formUnionWithCharacterSet:[NSCharacterSet letterCharacterSet]];
[characterSet formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]];
[characterSet formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
// Build array of components using specified characters as separtors
NSArray *arrayOfComponents = [str componentsSeparatedByCharactersInSet:characterSet];
// Create string from the array components
NSString *strOutput = [arrayOfComponents componentsJoinedByString:@""];
NSLog(@"New string: %@", strOutput);
//New string: 250
//对于数字化结果的另一种方法.前面例子已经使用过了!就是利用decimalDigitCharacterSet加characterSetInverted操作.
NSMutableCharacterSet *decimalDigit = [NSMutableCharacterSet decimalDigitCharacterSet];
// invertedSet将去除的反过来变成不去除的
NSCharacterSet *characterSetInverted = [decimalDigit invertedSet];
NSArray *array =[str componentsSeparatedByCharactersInSet:characterSetInverted];
NSString *strResult = [array componentsJoinedByString:@""];
NSLog(@"New string: %@", strResult);
//New string: 250
}