NSCharacterSet在字符串操作中得使用
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 让你可以快速而充满自信地编码。这两者真是完美组合。
NSCharacterSet在字符串操作中得使用的更多相关文章
- [改善Java代码]推荐在复杂字符串操作中使用正则表达式
一.分析 字符串的操作,诸如追加.合并.替换.倒序.分隔等,都是在编码过程中经常用到的,而且Java也提供了append.replace.reverse.split等方法来完成这些操作,它们使用起来 ...
- 提高你的Java代码质量吧:推荐在复杂字符串操作中使用正则表达式
一.分析 字符串的操作,诸如追加.合并.替换.倒序.分隔等,都是在编码过程中经常用到的,而且Java也提供了append.replace.reverse.split等方法来完成这些操作,它们使用起来 ...
- NSCharacterSet 关于字符串编码
此文转自:http://nshipster.cn/nscharacterset/ 只为个人为了查找问题方便才复制过来的....... 正如之前提前过的,基础类库(Foundation)拥有最好的.功能 ...
- (三)String、StringBuilder、StringBuffer在字符串操作中的性能差异浅析
参考资料:https://www.iteye.com/blog/hank4ever-581463 <Core Java Volume I-Fundamentals>原书第十版 <Ja ...
- 编写高质量代码:改善Java程序的151个建议(第4章:字符串___建议56~59)
建议56:自由选择字符串拼接方法 对一个字符串拼接有三种方法:加号.concat方法及StringBuilder(或StringBuffer ,由于StringBuffer的方法与StringBuil ...
- ECMASCRIPT 6中字符串的新特性
本文将覆盖在ECMAScript 6 (ES6)中,字符串的新特性. Unicode 码位(code point)转义 Unicode字符码位的长度是21位[2].而JavaScript的字符串,是1 ...
- ES6 — 字符串String
ES6对字符串新增了一些函数和操作规范.下面我们来看ES6中对字符串新加的特性. 1.模版字符串 (即用反引号定义的字符串) 传统的字符串拼接通过我们使用'+'号与变量连接.例如: let name= ...
- lintcode:strStr 字符串查找
题目: 字符串查找 字符串查找(又称查找子字符串),是字符串操作中一个很有用的函数.你的任务是实现这个函数. 对于一个给定的 source 字符串和一个 target 字符串,你应该在 source ...
- C语言字符串的常见特殊操作(除了string.c实现的那些接口)
字符串操作中,必须掌握的一些之前已经在文章有写过了,比如说字符串查找,字符串粘帖,字符串拷贝等等,这些在标准C库的string.c中已经有实现,故包含#include <string.h> ...
随机推荐
- IOS开发_中遍历数组的方法及比较
数组,做为一种常用的数据类型,频繁出现在编码中,其中肯定少不了对数组的遍历,本博文对数组遍历,进行一下自己的归纳,如果是大牛,一笑而过就好,互相学习,欢迎指正. 话不多说直接进入主题 首先创建一个数组 ...
- Bootstrap<基础九>辅助类
Bootstrap 中的一些可能会派上用场的辅助类. 文本 以下不同的类展示了不同的文本颜色.如果文本是个链接鼠标移动到文本上会变暗: 类 描述 .text-muted "text-mu ...
- 【译】Permissions Best Practices Android M权限最佳做法
Permissions Best Practices PreviousNext In this document Consider Using an Intent Don't Overwhelm th ...
- 读取微博feed伪代码
// 读取我的好友fids $db = new DB(); $mc = new Memcached(); $_uid = 1; // my uid $sql = "select * from ...
- DLL 导出封装类
首先使用Wizard创建一个Win32 Dynamic-Link Library工程,然后定义一个简单的C++类CInDLL.由于该类会被工程之外的文件所引用,所以需要对这个类进行引出.因为只有引出后 ...
- javap查看class文件
通过JVM编译java文件生成class字节码文件,很多时候很想用工具打开看看,目前还不清楚哪一个软件专门查看class文件的,但是通过windows下的javap命令可以查看详细的class文件 S ...
- ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务解决
先看oracle的监听和oracle的服务是否都启动了. 启动oracle监听:cmd命令行窗口下,输入lsnrctl start,回车即启动监听. 查看oracle的sid叫什么,比如创建数据库的时 ...
- JavaScript判断数据类型
JavaScript中判断数据类型的方式有三种: 1.typeof typeof 1; //"number" typeof "abc"; //" ...
- break into Ubuntu System
This morning, I got a spare machine from of of the labmates. The OS is ubuntu 12.04. I could not log ...
- js操作dom---创建一个域来输出调试信息
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...