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. Go语言实现简单的一个静态WEB服务器

    package main import ( "net/http" ) func main() { http.Handle("/", http.FileServe ...

  2. linux命令每日一练习 显示一个文件的制定行---查看命令帮助信息

    sed -n '11,12p' ××× cat ***|tail -n +12|head -n 2 tail -n +5 显示末尾五行 查看一个命令的帮助 详细的 man *** 简略的 *** -- ...

  3. fvvk

    Hello world! D1C0E3D12E624362B9F8D55ABA2E0FB8,D1C0E3D12E624362B9F8D55ABA2E0FB9

  4. Which ports are considered unsafe on Chrome

    1, // tcpmux 7, // echo 9, // discard 11, // systat 13, // daytime 15, // netstat 17, // qotd 19, // ...

  5. 深入理解unslider.js源码

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

  6. 安装了简易版XP系统后不能安装IIS的解决办法

    第一步 找到C:\WINDOWS\inf文件夹中的sysoc.inf文件,在 [Components]区域中的NetOC=netoc.dll,NetOcSetupProc,netoc.inf,,7和c ...

  7. Python的平凡之路(17)

    一.认识jQuery       jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设 ...

  8. sqlite的常用语法

    sqllite 增删改查创建表的语法 创建表db.execSQL("create table user(_id integer primary key autoincrement,numbe ...

  9. 《java小应用程序(Applet)和java应用程序(Application)分别编写的简单计算器》

    Application和Java Applet的区别.Java语言是一种半编译半解释的语言.Java的用户程序分为两类:Java Application和Java Applet.这两类程序在组成结构和 ...

  10. 亲身试用python简单小爬虫

    前几天基友分享了一个贴吧网页,有很多漂亮的图片,想到前段时间学习的python简单爬虫,刚好可以实践一下. 以下是网上很容易搜到的一种方法: #coding=utf-8 import urllib i ...