谓词与正则表达式(OC)

谓词与正则表达式

文章目录

一、谓词

  1. 什么是谓词

谓词相当于一个过滤器,定义一个判断标准,将符合标准的对象保留下来

  1. 常用谓词语法

    • 比较类
    运算符 意思 示例
    = / == 等于 age == 18
    != / <> 不等于 age != 20
    > 大于 score > 60
    < 小于 price < 100
    >= 大于等于 age >= 18
    <= 小于等于 count <= 10
    • 逻辑运算类
    运算符 含义 示例
    AND / && 且(两个条件都满足) age >= 18 AND score > 60
    OR / ` 或(满足一个即可) name = '张三' OR name = '李四'
    NOT / ! 非(取反) NOT (age < 18)
    • 范围类
    运算符 含义 示例
    IN 在指定集合内 name IN {'张三','李四','王五'}
    BETWEEN 在两个值之间(闭区间) age BETWEEN {18, 30}
    • 字符串匹配运算
    运算符 含义 补充说明
    BEGINSWITH 以指定内容开头 [c]不区分大小写:BEGINSWITH[c]
    ENDSWITH 以指定内容结尾 [d]不区分重音符号
    CONTAINS 包含指定内容 例:name CONTAINS '张'
    LIKE 通配符匹配 * 代表任意长度字符,? 代表单个字符
    MATCHES 正则表达式匹配 后文详细讲解
  2. 创建谓词

    • 字符串
    objc 复制代码
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"age > %@ AND name == %@",age,name];
    • Block
    objc 复制代码
    NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary* bindings) {
        // 在这里写判断逻辑,返回 YES 表示符合条件
        return YES / NO;
    }];

    示例:

    objc 复制代码
    NSArray *people = @[...]; 
    NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(Person *person, NSDictionary *bindings) {
        // 年龄是偶数,并且名字长度大于1
        return (person.age % 2 == 0) && (person.name.length > 1);
    }];
    
    NSArray *result = [people filteredArrayUsingPredicate:pred];
    • 布尔值
    objc 复制代码
    // 永远返回 YES(所有对象都符合条件)
    NSPredicate *truePred = [NSPredicate predicateWithValue:YES];
    
    // 永远返回 NO(所有对象都不符合条件)
    NSPredicate *falsePred = [NSPredicate predicateWithValue:NO];

二、正则表达式

  1. 什么是正则表达式

正则表达式是一套通用的字符串匹配规则,用特殊符号组合成规则

  1. 语法
  • 锚点

    符号 含义
    ^ 匹配字符串开头
    $ 匹配字符串结尾
  • 元字符

    符号 含义
    . 匹配任意单个字符(换行符除外)
    \d 匹配任意数字(0-9)
    \D 匹配任意非数字
    \w 匹配字母、数字、下划线
    \W 匹配非字母数字下划线
    \s 匹配空白字符(空格、制表符、换行等)
    \S 匹配非空白字符
  • 量词

    符号 含义
    * 前面的字符出现 0 次或多次
    + 前面的字符出现 1 次或多次
    ? 前面的字符出现 0 次或 1 次
    {n} 前面的字符恰好出现 n 次
    {n,} 前面的字符至少出现 n 次
    {n,m} 前面的字符出现 n~m 次
符号 含义
[abc] 匹配 a、b、c 中的任意一个
[a-z] 匹配 a 到 z 的任意小写字母
[^abc] 匹配除了 a、b、c 之外的字符

\u4e00-\u9fa5:汉字范围

  1. 贪婪与懒惰

    对于a123b456b

    贪婪a.*b与懒惰a.*?b

    贪婪 :先吃掉整个字符串,再从右往左吐出字符,直到匹配成功,结果就是a123b456b

    懒惰 :从当前位置开始,每次只多吃一个字符,够了就停,结果a123b

三、示例:邮箱格式判断

objc 复制代码
NSString *email = @"test_123@163.com";
NSString *regex = @"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOL isValid = [pred evaluateWithObject:email];

说明:

  1. [A-Z0-9a-z]+

含义:邮箱用户名只能是大小写字母 + 数字,不能为空。

  1. @

匹配邮箱格式@号

  1. [A-Za-z0-9]+

和第一段规则一样:域名主体(如 163、qq、gmail),只能大小写字母 + 数字,至少 1 位。

  1. \\.

正则里单独 . = 匹配任意字符,不能用来表示小数点,其实是因为在字符串中\也不是真正的\,它也是一个转义符,我们需要让它的前面再套一个\让它成为真正的\,也就是\\.

作用:匹配邮箱里的点,比如 @qq.com 中间的 .

  1. [A-Za-z]{2,}

[A-Za-z]:只能大小写字母

{2,}:最少 2 个字符,无上限

匹配域名后缀:comcnorgnettop 等,不能是 1 位后缀

相关推荐
初级代码游戏12 小时前
iOS开发 Swift 速记7:结构体和类
开发语言·ios·swift
Anhty17 小时前
手机端叮咚变声器2026实测:功能表现、优缺点完整解析
功能测试·ios·智能手机·安卓
SameX20 小时前
后台定位耗电的问题,我花两年把它压到了3%-5%
ios
吴声子夜歌1 天前
正则表达式——环视
开发语言·正则表达式
星辰即远方1 天前
计算器仿写总结
学习·ui·ios·cocoa·xcode
游戏开发爱好者81 天前
系统状态:专为iPhone和iPad设计的实时系统性能监控工具全面介绍
android·ios·小程序·uni-app·iphone·webview·ipad
吴声子夜歌2 天前
正则表达式——边界
正则表达式
2501_915909062 天前
全面解析iOS应用上架到App Store的完整流程与关键注意事项
android·macos·ios·小程序·uni-app·cocoa·iphone
00后程序员张2 天前
抓包鹰 电脑本机网络连接表怎么看?哪些程序在联网 进程归属与可疑 IP 追溯
网络协议·计算机网络·网络安全·ios·adb·https·udp
2501_915918412 天前
免 Xcode 开发 iOS,工具链替代方案与编译、签名、安装
ide·vscode·macos·ios·个人开发·xcode·敏捷流程