头部背景图片
崇山峻岭 |
崇山峻岭 |

2016-08-24

NSCharacterSet使用

=

NSCharacterSet ,以及它的可变版本NSMutableCharacterSet,用面向对象的方式来表示一组Unicode字符。它经常与NSString及NSScanner组合起来使用,在不同的字符上做过滤、删除或者分割操作。为了给你提供这些字符是哪些字符的直观印象,请看看NSCharacterSet 提供的类方法:

  • alphanumericCharacterSet //
  • capitalizedLetterCharacterSet
  • controlCharacterSet //控制符
  • decimalDigitCharacterSet //小数
  • decomposableCharacterSet //可分解
  • illegalCharacterSet //非法字符
  • letterCharacterSet//文字
  • lowercaseLetterCharacterSet//小写字母
  • newlineCharacterSet //回车
  • nonBaseCharacterSet
  • punctuationCharacterSet //标点
  • symbolCharacterSet
  • uppercaseLetterCharacterSet
  • whitespaceAndNewlineCharacterSet//回车和空格
  • whitespaceCharacterSet //空格

与它的名字所表述的相反,NSCharacterSet 跟 NSSet 一点关系都没有。
虽然底层实现不太一样,但是 NSCharacterSet 在概念上跟 NSIndexSet 还有点相似的。NSIndexSet,之前提到过,表示一个有序的不重复的无符号整数的集合。Unicode字符跟无符号整数类似,大致对应一些拼写表示。所以,一个 NSCharacterSet +lowercaseCharacterSet 字符集与一个包含97到122范围的 NSIndexSet 是等价的。
现在我们对理解 NSCharacterSet 的基本概念已经有了少许自信,让我们来看一些它的模式与反模式吧:

###删除字符产前后空格
NSString -stringByTrimmingCharactersInSet: 是个你需要牢牢记住的方法。它经常会传入 NSCharacterSet +whitespaceCharacterSet 和 +whitespaceAndNewlineCharacterSet 来删除输入字符串的头尾的空白符号, 或者传入uppercaseLetterCharacterSet和lowercaseLetterCharacterSet删除首尾大小写

###删除字符串中所有空格
假设你去掉字符串两端的多余空格之后,还想去除单词之间的多余空格,这里有个非常简便的方法:

NSString *string = @"Lorem    ipsum dolar   sit  amet.";
string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

NSArray *components = [string componentsSeparatedByCharactersInSet:[NSCharacterSet     whitespaceCharacterSet]];
components = [components filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self     <> ''"]];
string = [components componentsJoinedByString:@" "];

首先,删除字符串首尾的空格;然后用 NSString -componentsSeparatedByCharactersInSet: 在空格处将字符串分割成一个 NSArray;再用一个 NSPredicate 去除空串;最后,用 NSArray -componentsJoinedByString: 用单个空格符将数组重新拼成字符串。注意:这种方法仅适用于英语这种用空格分割的语言

###字符串分词
不要用 NSCharacterSet 来分词。 用 CFStringTokenizer 来替代它。
你用 componentsSeparatedByCharactersInSet: 来清理用户输入是可以谅解的,但是用它来做更复杂的事情,你将陷入痛苦的深渊。
为什么?请记住,语言并不是都用空格作为词的分界。虽然实际上以空格分界的语言使用非常广泛。但哪怕只算上中国和日本就已经有十多亿人,占了世界人口总量的 16%。
……即使是用空格分隔的语言,分词也有一些模棱两可的边界条件,特别是复合词汇和标点符号。
以上只为说明:如果你想将字符串分成有意义的单词,那么请用 CFStringTokenizer (或者 enumerateSubstringsInRange:options:usingBlock:)吧。

2016-08-24

#字符串学习总结

##1. 创建

//构造方法
NSString *s1 = [[NSString alloc] initWithFormat:@"%@ 真简单", @"iOS开发"];
//类方法
NSString *s2 = [NSString stringWithFormat:@"%@ 好简单啊", @"OC"];
// 将 C 语言字符串转换成 OC 字符串
NSString *s3 = [[NSString alloc] initWithUTF8String:"hello iOS"];
//从文件读取
NSString *file = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/Launchable.h" encoding:NSUTF8StringEncoding error:nil];
//从url读取
NSString *html = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.youdao.com"] encoding:NSUTF8StringEncoding error:nil];

##2. 查看
//1. 比较
BOOL isEqual = [@”123” isEqualToString:@”123”];
//下面这个方法可以根据options进行排序,常见的有按数字排序(options:NSNumericSearch),
//有按照字符串排序, 还可以根据正则表达式排序
NSComparisonResult result = [@”123” compare:@”124” options:NSNumericSearch]);

//2. 判断字符串的前后缀, 返回值均为bool类型
[@"123.txt" hasSuffix:@".txt"]
[@"http://www.baidu.com hasPrefix:@"http://"]

//3. 根据range取字符串
//3.1 从字符串中获得子字符串的range
 NSRange range = [@"abcdefgcdefg"; rangeOfString:@"acd"];
 //可以通过判断range.location 判断有没有找到
 if(range.location == NSNotFound) {
     NSLog(@"没有找到");
 }


 //3.2下面是一个例子寻找字符串中所有包含子字符串的位置和长度, 
   str = @"123abcd456defg123ab45qw";


    NSRange range = NSMakeRange(0, 0);
    do {
        NSUInteger loc = range.location + range.length;
        NSUInteger len = str.length - loc;
        range = [str rangeOfString:@"3a" options:1 range:NSMakeRange(loc, len)];

        if (range.location != NSNotFound) {
            NSLog(@"%@", NSStringFromRange(range));
        }
    } while (range.location != NSNotFound);

  //4. 获取子字符串
  // 子字符串 substring
    NSString *str = @"0123456789";
    NSString *s1 = [str substringFromIndex:5];
    NSLog(@"%@", s1);
    NSString *s2 = [str substringToIndex:5];
    NSLog(@"%@", s2);
    // 在科学计算中有一个习惯, 表示范围的时候, 左边取得到, 右边取不到
    // arc4random_uniform(10)
    // 左闭右开区间
    NSRange range = NSMakeRange(3, 3);
    NSString *s3 = [str substringWithRange:range];
    NSLog(@"%@", s3);

//5. 通过正则匹配字符串
// 正则表达式, regular expression
    // [^字符] 含义是非该字符的字符
    // [^<] 不是 < 的任意字符
    // + 放在通配符的后面, 表示多个的意思
    // [^<]+ 就是任意多个不由<组合而来的字符串
    NSString *mark = @"<sapn style\"color:red\">1234567890987654321qazwsxedc</span>";
    NSRange range = [mark rangeOfString:@">[^<]+<" options:1024];
    range = NSMakeRange(range.location + 1, range.length - 2);
    NSString *res = [mark substringWithRange:range];
    NSLog(@"%@", res);

 //6. 其他用法
 //去掉首尾空格
 NSString *str1 = @"   admin    ";
    NSLog(@"|%@|", str1);
    str1 = [str1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    NSLog(@"|%@|", str1);
   //去掉收尾大写 
    NSString *str2 = @"ABCadminDEF";
    NSLog(@"|%@|", str2);
    str2 = [str2 stringByTrimmingCharactersInSet:[NSCharacterSet uppercaseLetterCharacterSet]];
    NSLog(@"|%@|", str2);
    去掉首尾小写
    NSString *str3 = @"abcADMINdefg";
    NSLog(@"|%@|", str3);
    str3 = [str3 stringByTrimmingCharactersInSet:[NSCharacterSet lowercaseLetterCharacterSet]];
    NSLog(@"|%@|", str3);
    //去掉/
    NSString *path = @"/Users/apple/Destop/";
    path = [path stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]];
    NSLog(@"path = %@", path);
  • 1

  • 2

  • 3

  • 4

  • 5