谓词

1、谓词:

Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取。我们可以编写简单的谓词语句,就可以从数组中过滤出我们想要的数据。

//<、>、=,<=、>=、  and、or
NSArray * array = @[@12,@34,@10,@90,@89];
NSPredicate * predicate1 = [NSPredicate predicateWithFormat:@"self >= 34 or self < 89 "];
NSArray * resultArray1 = [array filteredArrayUsingPredicate:predicate1];
//CONTAINS、BEGINSWITH、endswith : 包含谁、 以谁为前缀,以谁为后缀;
//[c]:不区分大小写 ;[d]:不区分重音符;[cd]
NSArray * array2 = [NSArray arrayWithObjects:@"erw",@"guangzhou",@"luzhou",@"郑州 00 ",@"杭州 00",@"langzhou",@"wuhan", nil];

NSPredicate * predicate2 = [NSPredicate predicateWithFormat:@"self contains[c] 'Ang'"];
NSArray * resultArray2 = [array2 filteredArrayUsingPredicate:predicate2];
    
NSPredicate * predicate3 = [NSPredicate predicateWithFormat:@"self endswith[c] 'ou'"];
NSArray * resultArray3 = [array2 filteredArrayUsingPredicate:predicate3];
//like :像
//*:0个或者多个字符;通配符
//?:1个字符;
NSArray * array2 = [NSArray arrayWithObjects:@"erw",@"guangzhou",@"luzhou",@"郑州 00 ",@"杭州 00",@"langzhou",@"wuhan", nil];
NSPredicate * predicate4 = [NSPredicate predicateWithFormat:@"self like '?州*'"];
NSArray * resultArray4= [array2 filteredArrayUsingPredicate:predicate4];
//取 交集、差集 :self in ~;not (self in ~)
NSArray * array4 = @[@34,@67,@45];
NSArray * filterArray = @[@12,@34];
NSPredicate * predicate6 = [NSPredicate predicateWithFormat:@"not (self in %@ )",filterArray];
NSArray * resultArray6 = [array4 filteredArrayUsingPredicate:predicate6];
//自定义类型
    People * p1 = [[People alloc]init];
    p1.age  =19 ;
    p1.name = @"zhangSan";
    
    People * p2 = [[People alloc]init];
    p2.age  = 29 ;
    p2.name = @"liSi";
    
    People * p3 = [[People alloc]init];
    p3.age  = 22;
    p3.name = @"zhangSanfeng";
    
    People * p4 = [[People alloc]init];
    p4.age  = 20 ;
    p4.name = @"zhang";
    
    People * p5 = [[People alloc]init];
    p5.age  = 19 ;
    p5.name = @"San";
    
    NSArray * array3 =[ NSArray arrayWithObjects:p1,p2,p3,p4,p5, nil];
    //说明过滤规则
    NSPredicate * predicate5 = [NSPredicate predicateWithFormat:@"self.name beginswith 'zhang' and self.age > 20"];
    NSArray * resultArray5 = [array3 filteredArrayUsingPredicate:predicate5];
    NSLog(@"%@",resultArray5);
//取 交集、差集 :self in ~;not (self in ~)
    NSArray * array4 = @[@34,@67,@45];
    NSArray * filterArray = @[@12,@34];
    NSPredicate * predicate6 = [NSPredicate predicateWithFormat:@"not (self in %@ )",filterArray];
    NSArray * resultArray6 = [array4 filteredArrayUsingPredicate:predicate6];
    NSLog(@"%@",resultArray6);
    
    //2、判断某一个对象是否满足条件
    NSString * str = @"eurtio";
    NSPredicate * predicate7 = [NSPredicate predicateWithFormat:@"self beginswith 'q'"];
    //判断str是否满足predicate7这个条件
    BOOL result7 =  [predicate7 evaluateWithObject:str];
    NSLog(@"%d",result7);
    
    NSNumber * num = @90 ;
    NSPredicate  * predicate8 = [NSPredicate predicateWithFormat:@"self < 80"];
    BOOL result8 = [predicate8 evaluateWithObject:num];
    NSLog(@"result8 = %d",result8);
    
    People * p = [[People alloc]init];
    p.age  =89 ;
    p.name = @"zhangSan";
    
    NSPredicate * predicate9 = [NSPredicate predicateWithFormat:@"self.age >= 80 and self.name beginswith[c] 'Zh'"];
    BOOL result9 = [predicate9 evaluateWithObject:p];
    
    NSLog(@"result9 = %d",result9);

2、正则表达式

正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式。 正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分。它可以迅速地用极简单的方式达到字符串的复杂控制。

//是否是有效的正则表达式
+ (BOOL)isValidateRegularExpression:(NSString *)strDestination byExpression:(NSString *)strExpression 
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", strExpression];
    return [predicate evaluateWithObject:strDestination];
}
/验证email
+(BOOL)isValidateEmail:(NSString *)email
{
    NSString * strRegex =@"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{1,5}" ;
    NSLog(@"%@",strRegex);
    
    BOOL rt = [self isValidateRegularExpression:email byExpression:strRegex];
    return rt;
}

//验证电话号码
+(BOOL)isValidateTelNumber:(NSString *)number {
    
    NSString *strRegex = @"[0-9]{1,20}";
    
    BOOL rt = [self isValidateRegularExpression:number byExpression:strRegex];
    
    return rt;
    
}

// 正则判断手机号码地址格式
- (BOOL)isMobileNumber:(NSString *)mobileNum
{
    /**
     * 手机号码
     * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     * 联通:130,131,132,152,155,156,185,186
     * 电信:133,1349,153,180,189
     */
    NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
    /**
     * 中国移动:China Mobile
     * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     */
    NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
    /**
     * 中国联通:China Unicom
     * 130,131,132,152,155,156,185,186
     */
    NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
    /**
     * 中国电信:China Telecom
     * 133,1349,153,180,189
     */
    NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
    /**
     * 大陆地区固话及小灵通
     * 区号:010,020,021,022,023,024,025,027,028,029
     * 号码:七位或八位
     */
    // NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
    
    NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
    
    NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
    NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
    NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
    
    if (([regextestmobile evaluateWithObject:mobileNum] == YES)
        || ([regextestcm evaluateWithObject:mobileNum] == YES)
        || ([regextestct evaluateWithObject:mobileNum] == YES)
        || ([regextestcu evaluateWithObject:mobileNum] == YES))
    {
        if([regextestcm evaluateWithObject:mobileNum] == YES)
        {
            NSLog(@"China Mobile");
        }
        else if([regextestct evaluateWithObject:mobileNum] == YES)
        {
            NSLog(@"China Telecom");
        }
        else if ([regextestcu evaluateWithObject:mobileNum] == YES)
        {
            NSLog(@"China Unicom");
        }
        else
        {
            NSLog(@"Unknow");
        }
        return YES;
    }
    else
    {
        return NO;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容

  • 首先,我们需要知道何谓谓词,让我们看看官方的解释: The NSPredicate class is used t...
    jeckHao阅读 1,140评论 1 5
  • 首先,我们需要知道何谓谓词,让我们看看官方的解释:The NSPredicate class is used to...
    旭日飞扬阅读 1,521评论 0 0
  • 一、NSPredicate的基本语法 我们使用一门语言,无论是外语还是计算机语言,总是从语法开始的,这样我们才能正...
    弹吉他的少年阅读 493评论 1 0
  • 什么是谓词查询 NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索。 可以使用谓词表示逻辑条件...
    奔跑的_猿阅读 1,868评论 0 1
  • 拖延需要戒。——大栗致自己 信用卡提额是很多持卡人关注的焦点。今天来介绍一下各大银行提高额度的方法和技巧。 1.中...
    有杕之杜阅读 1,287评论 1 3