NSCharacterSet的使用

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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值