谓词与正则表达式
文章目录
一、谓词
- 什么是谓词
谓词相当于一个过滤器,定义一个判断标准,将符合标准的对象保留下来
-
常用谓词语法
- 比较类
运算符 意思 示例 =/==等于 age == 18!=/<>不等于 age != 20>大于 score > 60<小于 price < 100>=大于等于 age >= 18<=小于等于 count <= 10- 逻辑运算类
运算符 含义 示例 AND/&&且(两个条件都满足) age >= 18 AND score > 60OR/ `或(满足一个即可) 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正则表达式匹配 后文详细讲解 -
创建谓词
- 字符串
objcNSPredicate *pred = [NSPredicate predicateWithFormat:@"age > %@ AND name == %@",age,name];- Block
objcNSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary* bindings) { // 在这里写判断逻辑,返回 YES 表示符合条件 return YES / NO; }];示例:
objcNSArray *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];
二、正则表达式
- 什么是正则表达式
正则表达式是一套通用的字符串匹配规则,用特殊符号组合成规则
- 语法
-
锚点
符号 含义 ^匹配字符串开头 $匹配字符串结尾 -
元字符
符号 含义 .匹配任意单个字符(换行符除外) \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:汉字范围
-
贪婪与懒惰
对于
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];
说明:
[A-Z0-9a-z]+
含义:邮箱用户名只能是大小写字母 + 数字,不能为空。
@
匹配邮箱格式@号
[A-Za-z0-9]+
和第一段规则一样:域名主体(如 163、qq、gmail),只能大小写字母 + 数字,至少 1 位。
\\.
正则里单独 . = 匹配任意字符,不能用来表示小数点,其实是因为在字符串中\也不是真正的\,它也是一个转义符,我们需要让它的前面再套一个\让它成为真正的\,也就是\\.
作用:匹配邮箱里的点,比如 @qq.com 中间的 .
[A-Za-z]{2,}
[A-Za-z]:只能大小写字母
{2,}:最少 2 个字符,无上限
匹配域名后缀:com、cn、org、net、top 等,不能是 1 位后缀