NSCharacter​Set使用

Posted wangjunling888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSCharacter​Set使用相关的知识,希望对你有一定的参考价值。

NSCharacter​Set使用

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:)吧。

以上是关于NSCharacter​Set使用的主要内容,如果未能解决你的问题,请参考以下文章

如何去除 MatLab 中绘制区域之间的分界线?

iOS开发之字符串去掉首尾空格换行

合并来自 std::set 的相邻条目

8存储过程

Redis 学习笔记 基本命令:Set操作

SAS 对数据的拼接与串接