谓词与正则表达式(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 位后缀

相关推荐
wujf9010 小时前
Go 内存泄漏排查完整教程 (pprof)
开发语言·golang·xcode
秋雨梧桐叶落莳12 小时前
iOS——3GShare项目总结
学习·macos·ios·objective-c·cocoa
AIsoft_86881 天前
iOS端录音转文字工具实测:自媒体创作者高效整理指南
ios·媒体
库奇噜啦呼1 天前
【iOS】Core Data
ios
2501_915106322 天前
TraceEagle 代理抓包教程 本机和手机的 HTTPS 抓包方法
网络协议·计算机网络·网络安全·ios·adb·https·udp
云逸_2 天前
Cinder:基于 Swift Macro 与 Mach-O Section 的解耦注册机制
ios·swift
末代iOS程序员华仔2 天前
从 Figma 到上架:使用 Codex 与 MCP 全流程实现 AI 聊天 App
flutter·ios·swift
极客猴子2 天前
苹果手机怎么快速总结长文本?iOS录音APP实测对比
ios·智能手机
一牛2 天前
Swift 循环引用
macos·ios