NSString拼接字符串和NSPredicate详解
| NSString* string;?// 結(jié)果字符串 |
| 02 | NSString* string1, string2;?//已存在的字符串,需要將string1和string2連接起來(lái) |
| 03 | ? |
| 04 | //方法1. |
| 05 | string = [[NSString alloc]initWithFormat:@"%@,%@", string1, string2 ]; |
| 06 | ? |
| 07 | //方法2. |
| 08 | string = [string1 stringByAppendingString:string2]; |
| 09 | ? |
| 10 | //方法3 . |
| 11 | string = [string stringByAppendingFormat:@"%@,%@",string1, string2]; |
經(jīng)常用的是第二種方法。
NSPredicate類(lèi):主要用來(lái)指定過(guò)濾器的條件,該對(duì)象可以準(zhǔn)確的描述所需條件,對(duì)每個(gè)對(duì)象通過(guò)謂詞進(jìn)行篩選,判斷是否與條件相匹配。謂詞是指在計(jì)算機(jī)中表示計(jì)算真假值的函數(shù)。原理和用法都類(lèi)似于SQL查詢(xún)中的where,作用相當(dāng)于數(shù)據(jù)庫(kù)的過(guò)濾取。主要用于從集合中分揀出符合條件的對(duì)象,也可以用于字符串的正則匹配
定義(最常用到的方法):
[plain]?view plaincopy
例子1:
(1)對(duì)NSArray進(jìn)行過(guò)濾?
[plain]?view plaincopy
例子2:
[plain]?view plaincopy
[plain]?view plaincopy
[plain]?view plaincopy
我們看到創(chuàng)建謂詞使用類(lèi)方法predicateWithFormat: (NSString*) format,
format 里的東西真的和SQL 的where 條件差不多。
另外,參數(shù)format 與NSLog 的格式化模版差不多,如果1 和188.0 是傳遞過(guò)來(lái)的參數(shù),你可以寫(xiě)成如下的形式:
@"pid>%d and height<%f",1,188.0
(1)比較運(yùn)算符>,<,==
可用于數(shù)值及字符串
例:@"number > 100"
(1.) 邏輯運(yùn)算符:AND、OR、NOT
這幾個(gè)運(yùn)算符計(jì)算并、或、非的結(jié)果。
(2.) 范圍運(yùn)算符:BETWEEN、IN
例:
@”pid BETWEEN {1,5}”
@"name IN {'Name1','Name2'}"
(3.) 占位符:
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:
@"Name1", @"NAME",nil];
NSPredicate *pre=[preTemplate predicateWithSubstitutionVariables: dic];
占位符就是字段對(duì)象里的key,因此你可以有多個(gè)占位符,只要key 不一樣就可以了。
(4.) 快速篩選數(shù)組:
前面我們都是使用謂詞逐個(gè)判斷數(shù)組內(nèi)的對(duì)象是否符合,其實(shí)數(shù)組本身有更為便捷的方法,
直接篩選出一個(gè)符合謂詞的新數(shù)組。
NSPredicate *pre = [NSPredicate predicateWithFormat:@"pid>1"];
NSMutableArray *arrayPre=[array filteredArrayUsingPredicate: pre];
NSLog(@"%@",[[arrayPre objectAtIndex: 0] name]);
(5.) 字符串運(yùn)算符:
BEGINSWITH、ENDSWITH、CONTAINS 分別表示是否以某字符串開(kāi)頭、結(jié)尾、包含。
他們可以與c、d 連用,表示是否忽略大小寫(xiě)、是否忽略重音字母(字母上方有聲調(diào)標(biāo)號(hào))。
例:
@”name BEGINSWITH[cd] ‘He’”
判斷name 是否以He 開(kāi)頭,并且忽略大小寫(xiě)、忽略重音字母。
(6.) LIKE 運(yùn)算符:
LIKE 使用?表示一個(gè)字符,*表示多個(gè)字符,也可以與c、d 連用。
例:
@”name LIKE ‘???er*’” 與Paper Plane 相匹配。
(7.) SELF:
前面的數(shù)組中放的都是對(duì)象,如果數(shù)組放的都是字符串(或者是其他沒(méi)有屬性的類(lèi)型),該
怎么寫(xiě)謂詞呢?這里我們使用SELF。
例:
NSArray *arrays=[NSArray arrayWithObjects: @"Apple", @"Google", @"MircoSoft", nil];
NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"SELF=='Apple'"];
(8.) 正則表達(dá)式:
NSPredicate 使用MATCHES 匹配正則表達(dá)式,正則表達(dá)式的寫(xiě)法采用international components
for Unicode (ICU)的正則語(yǔ)法。
例:
NSString *regex = @"^A.+e$";//以A 開(kāi)頭,以e 結(jié)尾的字符。
NSPredicate *pre= [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if([pre evaluateWithObject: @"Apple"]){
printf("YES\n");
}else{
printf("NO\n");
}
例子3:
一般來(lái)說(shuō)這種情況還是蠻多的,比如你從文件中讀入了一個(gè)array1,然后想把程序中的一個(gè)array2中符合array1中內(nèi)容的元素過(guò)濾出來(lái)。
正 常傻瓜一點(diǎn)就是兩個(gè)for循環(huán),一個(gè)一個(gè)進(jìn)行比較,這樣效率不高,而且代碼也不好看。
其實(shí)一個(gè)循環(huán)或者無(wú)需循環(huán)就可以搞定了,那就需要用搞 NSPredicate這個(gè)類(lèi)了~膜拜此類(lèi)~
1)例子一,一個(gè)循環(huán)
| NSArray *arrayFilter = [NSArray arrayWithObjects:@"pict", @"blackrain", @"ip", nil]; NSArray *arrayContents = [NSArray arrayWithObjects:@"I am a picture.", @"I am a guy", @"I am gagaga", @"ipad", @"iphone", nil]; |
我想過(guò)濾arrayContents的話只要循環(huán) arrayFilter就好了
| int i = 0, count = [arrayFilter count]; for(i = 0; i < count; i ++) { NSString *arrayItem = (NSString *)[arrayFilter objectAtIndex:i]; NSPredicate *filterPredicate = [[NSPredicate predicateWithFormat:@"SELF CONTAINS %@", arrayItem]; NSLog(@"Filtered array with filter %@, %@", arrayItem, [arrayContents filteredArrayUsingPredicate:filterPredicate]); } |
當(dāng)然以上代碼中arrayContent最好用mutable 的,這樣就可以直接filter了,NSArray是不可修改的。
2)例子二,無(wú)需循環(huán)
| NSArray *arrayFilter = [NSArray arrayWithObjects:@"abc1", @"abc2", nil]; NSArray *arrayContent = [NSArray arrayWithObjects:@"a1", @"abc1", @"abc4", @"abc2", nil]; NSPredicate *thePredicate = [NSPredicate predicateWithFormat:@"NOT (SELF in %@)", arrayFilter]; [arrayContent filterUsingPredicate:thePredicate];
|
這樣arrayContent過(guò)濾出來(lái)的就是不包含 arrayFilter中的所有item了。
3)生成文件路徑下文件集合列表
NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *defaultPath = [[NSBundle mainBundle] resourcePath]; NSError *error; NSArray *directoryContents = [fileManager contentsOfDirectoryAtPath:defaultPath error:&error]
4)match的用法
?? ?1. 簡(jiǎn)單比較
NSString *match = @"imagexyz-999.png"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF == %@", match]; NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate]; 2. match里like的用法(類(lèi)似Sql中的用法) NSString *match = @"imagexyz*.png"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like %@", match]; NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];3. 大小寫(xiě)比較 [c]表示忽略大小寫(xiě),[d]表示忽略重音,可以在一起使用,如下: NSString *match = @"imagexyz*.png"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like[cd] %@", match]; NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];4.使用正則 NSString *match = @"imagexyz-\\d{3}\\.png"; //imagexyz-123.png NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF matches %@", match]; NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];總結(jié):
1) 當(dāng)使用聚合類(lèi)的操作符時(shí)是可以不需要循環(huán)的
2)當(dāng)使用單個(gè)比較類(lèi)的操作符時(shí)可以一個(gè)循環(huán)來(lái)搞定
PS,例子 一中嘗試使用[@"SELF CONTAINS %@", arrayFilter] 來(lái)過(guò)濾會(huì)掛調(diào),因?yàn)镃ONTAINS時(shí)字符串比較操作符,不是集合操作符。
NSPredicate源代碼:
[plain]?view plaincopy總結(jié)
以上是生活随笔為你收集整理的NSString拼接字符串和NSPredicate详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: componentsJoinedBySt
- 下一篇: iOS 正则表达式判断纯数字以及匹配11