NSCharacterSet以及它的可变版本NSMutableCharacterSet,用面向对象的方式表示一组Unicode字符,它经常与NSString及NSScanner组合起来使用,在不同的字符上做过滤,删除或者分割操作,下面是NSCharacterSet提供的类方法

Creating a Standard Character Set
+ alphanumericCharacterSet
+ capitalizedLetterCharacterSet
+ controlCharacterSet
+ decimalDigitCharacterSet
+ decomposableCharacterSet
+ illegalCharacterSet
+ letterCharacterSet
+ lowercaseLetterCharacterSet
+ newlineCharacterSet
+ nonBaseCharacterSet
+ punctuationCharacterSet
+ symbolCharacterSet
+ uppercaseLetterCharacterSet
+ whitespaceAndNewlineCharacterSet
+ whitespaceCharacterSet
Creating a Character Set for URL Encoding
+ URLFragmentAllowedCharacterSet
+ URLHostAllowedCharacterSet
+ URLPasswordAllowedCharacterSet
+ URLPathAllowedCharacterSet
+ URLQueryAllowedCharacterSet
+ URLUserAllowedCharacterSet
Creating a Custom Character Set
+ characterSetWithCharactersInString:
+ characterSetWithRange:
– invertedSet
Creating and Managing Character Sets as Bitmap Representations
+ characterSetWithBitmapRepresentation:
+ characterSetWithContentsOfFile:
– bitmapRepresentation
Testing Set Membership
– characterIsMember:
– hasMemberInPlane:
– isSupersetOfSet:
– longCharacterIsMember:

去掉空格

NSString -stringByTrimmingCharactersInSet: 是个你需要牢牢记住的方法。它经常会传入NSCharacterSet +whitespaceCharacterSet 或 +whitespaceAndNewlineCharacterSet 来删除输入字符串的头尾的空白符号。

 //除去字符串两端的空格
+(NSString *) trimStringWhitespace:(NSString *)str{
NSCharacterSet *whitespace = [NSCharacterSet whitespaceCharacterSet];
str = [str stringByTrimmingCharactersInSet:whitespace];
return str;
}
 //判断一个字符串是否只包含数字
+(BOOL)isTureCustomNum:(NSString *)customNum
{
NSCharacterSet *nameCharacters = [[NSCharacterSet characterSetWithCharactersInString:@""] invertedSet];
NSRange userNameRange = [customNum rangeOfCharacterFromSet:nameCharacters];
if (userNameRange.location != NSNotFound) {
//包含特殊字符
return NO;
}else{
return YES;
} } //判断一个字符串是否只包含字母 、数字和下划线
+(BOOL)isValidateString:(NSString *)str{
NSCharacterSet *nameCharacters = [[NSCharacterSet characterSetWithCharactersInString:@"_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"] invertedSet];
NSRange userNameRange = [str rangeOfCharacterFromSet:nameCharacters];
if (userNameRange.location != NSNotFound) {
//包含特殊字符
return NO;
}else{
return YES;
}
}

这个方法仅仅除去了开头和结尾空白符号,如果你想除去单词之间的额外空格,看下面的一个方法

     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 来替代它

语言并不是都用空格作为词的分界。虽然实际上以空格分界的语言使用非常广泛。

……即使是用空格分隔的语言,分词也有一些模棱两可的边界条件,特别是复合词汇和标点符号。

以上只为说明:如果你想将字符串分成有意义的单词,那么请用 CFStringTokenizer (或者enumerateSubstringsInRange:options:usingBlock:)吧

从字符串解析数据

NSScanner 是个用以解析任意或半结构化的字符串的数据的类。当你为一个字符串创建一个扫描器时,你可以指定忽略哪些字符,这样可以避免那些字符以各种各样的方式被包含到解析出来的结果中。

例如,你想从这样一个字符串中解析出开门时间:

Mon-Thurs: 8:00 - 18:00 Fri: 7:00 - 17:00 Sat-Sun: 10:00 - 15:00

你会 enumerateLinesUsingBlock: 并像这样用一个 NSScanner 来解析:

     NSMutableCharacterSet *skippedCharacters = [NSMutableCharacterSet punctuationCharacterSet];
[skippedCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; [hours enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) {
NSScanner *scanner = [NSScanner scannerWithString:line];
[scanner setCharactersToBeSkipped:skippedCharacters]; NSString *startDay, *endDay;
NSUInteger startHour, startMinute, endHour, endMinute; [scanner scanCharactersFromSet:[NSCharacterSet letterCharacterSet] intoString:&startDay];
[scanner scanCharactersFromSet:[NSCharacterSet letterCharacterSet] intoString:&endDay]; [scanner scanInteger:&startHour];
[scanner scanInteger:&startMinute];
[scanner scanInteger:&endHour];
[scanner scanInteger:&endMinute];
}];

我们首先从空格字符集和标点符号字符集的并集构造了一个 NSMutableCharacterSet。告诉 NSScanner忽略这些字符以极大地减少解析这些字符的必要逻辑。

scanCharactersFromSet: 传入字母字符集得到每项中一星期内的开始和结束(可选)的天数。scanInteger 类似地,得到下一个连续的整型值。

NSCharacterSet 和 NSScanner 让你可以快速而充满自信地编码。这两者真是完美组合。

NSCharacter​Set在字符串操作中得使用的更多相关文章

  1. [改善Java代码]推荐在复杂字符串操作中使用正则表达式

    一.分析  字符串的操作,诸如追加.合并.替换.倒序.分隔等,都是在编码过程中经常用到的,而且Java也提供了append.replace.reverse.split等方法来完成这些操作,它们使用起来 ...

  2. 提高你的Java代码质量吧:推荐在复杂字符串操作中使用正则表达式

    一.分析  字符串的操作,诸如追加.合并.替换.倒序.分隔等,都是在编码过程中经常用到的,而且Java也提供了append.replace.reverse.split等方法来完成这些操作,它们使用起来 ...

  3. NSCharacter​Set 关于字符串编码

    此文转自:http://nshipster.cn/nscharacterset/ 只为个人为了查找问题方便才复制过来的....... 正如之前提前过的,基础类库(Foundation)拥有最好的.功能 ...

  4. (三)String、StringBuilder、StringBuffer在字符串操作中的性能差异浅析

    参考资料:https://www.iteye.com/blog/hank4ever-581463 <Core Java Volume I-Fundamentals>原书第十版 <Ja ...

  5. 编写高质量代码:改善Java程序的151个建议(第4章:字符串___建议56~59)

    建议56:自由选择字符串拼接方法 对一个字符串拼接有三种方法:加号.concat方法及StringBuilder(或StringBuffer ,由于StringBuffer的方法与StringBuil ...

  6. ECMASCRIPT 6中字符串的新特性

    本文将覆盖在ECMAScript 6 (ES6)中,字符串的新特性. Unicode 码位(code point)转义 Unicode字符码位的长度是21位[2].而JavaScript的字符串,是1 ...

  7. ES6 — 字符串String

    ES6对字符串新增了一些函数和操作规范.下面我们来看ES6中对字符串新加的特性. 1.模版字符串 (即用反引号定义的字符串) 传统的字符串拼接通过我们使用'+'号与变量连接.例如: let name= ...

  8. lintcode:strStr 字符串查找

    题目: 字符串查找 字符串查找(又称查找子字符串),是字符串操作中一个很有用的函数.你的任务是实现这个函数. 对于一个给定的 source 字符串和一个 target 字符串,你应该在 source ...

  9. C语言字符串的常见特殊操作(除了string.c实现的那些接口)

    字符串操作中,必须掌握的一些之前已经在文章有写过了,比如说字符串查找,字符串粘帖,字符串拷贝等等,这些在标准C库的string.c中已经有实现,故包含#include <string.h> ...

随机推荐

  1. 高性能javascript(记录一)

    脚本位置:将js脚本放置在body底部,由于脚本会阻塞页面渲染,导致明显延迟,通常表现为空白页面,用户无法游览页面的内容,也无法与页面进行交互.故因此推荐js脚本放在body底部,尽可能减少对整个页面 ...

  2. ittun配置和使用教程

    有好久没写博了.时间过得真快,一下子一年又过去了. 不墨迹这么多了. 作为一个前端,页面写好了少不了做测试以及给其他同事看看效果,然而公司没有测试服务器,真是悲催哦. 一直都是用ip地址看页面的.但是 ...

  3. iosOpenDev-install 失败官方wiki无法解决看这里(尝试有效)

    https://github.com/kokoabim/iOSOpenDev/wiki/Troubleshoot http://blog.csdn.net/bluesky_03/article/det ...

  4. POJ 3463 有向图求次短路的长度及其方法数

    题目大意: 希望求出走出最短路的方法总数,如果次短路只比最短路小1,那也是可取的 输出总的方法数 这里n个点,每个点有最短和次短两种长度 这里采取的是dijkstra的思想,相当于我们可以不断找到更新 ...

  5. 封装pyMysql

    #!/usr/bin/python import MySQLdb class SpiderPDO: def __init__(self): db_host = '127.0.0.1' db_user ...

  6. centos7安装

    1.准备工具 VMware,我用的是 VMware11 2.打开VMware,创建新的虚拟机 3.选择典型-->下一步 4.稍后安装操作系统-->下一步 5.选择linux操作系统,lin ...

  7. sigaction和sigqueue

    sigaction函数相对于siganl函数控制信号的发送要更加精确一些,其函数原型为: int sigaction(int signum, const struct sigaction *act, ...

  8. Kindle使用的一些方法

    最大的好处就是方便,买书便宜,到手我就买了六部书,十块钱不到,以纸书的价格一本都买不到,能够买一些一直想读一下,但又担心读不下去的书.而且买了之后完全不用担心书柜收纳不下了.另外很轻便,放在包里上下班 ...

  9. 深入理解unslider.js源码

    最近用到了一个挺好用的幻灯片插件,叫做unslider.js,就想看看怎么实现幻灯片功能,就看看源码,顺便自己也学习学习.看完之后收获很多,这里和大家分享一下. unslider.js 源码和使用教程 ...

  10. MVC 实体字段自定义验证

    [Remote("ActionName", "ControllerName", AdditionalFields = "ID", Error ...