predicate,论断,一种逻辑表达。论断一个事件成立。可以用在很多地方,比如作为数组的过滤器等等。(边看文档边写)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", @[@"Stig", @"Shaffiq", @"Chris"]];//暂时不用理解表达式的意思,反正这是一个论断
BOOL result = [predicate evaluateWithObject:@"Shaffiq"];//判断论断是否成立
NSMutableArray *array =
[NSMutableArray arrayWithObjects:@"Nick", @"Ben", @"Adam", @"Melissa", nil];//一个可变数组
NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] 'a'"];//一个论断,表示一定以字符a开头
NSArray *beginWithB = [array filteredArrayUsingPredicate:bPredicate];//过滤得到的新数组中只含一个对象@"Adam"了
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"department.name like %@", departmentName];
可以看到,在表达式里可以直接用路径department.name,就表示department.name对象,而不用像NSString一样,每个对象都需要用%@表示,然后在后面填写参数。
再看:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"ANY employees.firstName like 'Matthew'"];
这个论断表示employees数组中至少有个对象的firstName属性是Mattew。
NSPredicate *catPredicate =
[NSPredicate predicateWithFormat:@"SELF MATCHES '.*(CAT){3,}(?!CA).*' ""];//这里最后多了一个双引号请忽略,加它只是为了让编辑器正确显示代码的颜色
NSArray *filteredArray = [array filteredArrayUsingPredicate:catPredicate];
创建一个论断,需要有论断表达式。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"format",parameter1,parameter2,...];
这个格式化字符串可以是字符串常量、字符串变量、可以包含通配符,包含布尔值,包含对象。具体语法见下一节。
NSPredicate *betweenPredicate =
[NSPredicate predicateWithFormat: @"attributeName BETWEEN %@", @[@1, @10]];
AND,&&,OR,||,NOT,! 都可以用
ANY children.age < 18
表示至少有一个children对象的age属性都小于18 ALL children.age < 14
表示所有children对象的age属性都小于18name IN {'Ben','PanPan','OhYeah'}
NSPredicate *inPredicate =
[NSPredicate predicateWithFormat: @"attribute IN %@", aCollection];
参考这个网站
http://userguide.icu-project.org/strings/regexp
表格 |
---|
方括号[ ]表示集合,也可以理解为范围,在方括号中指明范围。 |
[abc]表示abc中的一个 |
^符号是除了的意思如,[^abc],表示范围是除了a,b,c以外的所有字符 |
-符号表示到、至的意思,如[a-c],表示a到c;再如[\u0000-\uffff],表示unicode编码的所有字符 |
\p{certainCategory} 表示Unicode类别为certainCategory的字符,比如:[\p{Letter}]表示的范围为属于Unicode编码的Letter类中的所有字符 |
\P{certainCategory} 表示除了Unicode类别为certainCategory以外的字符 |
&&和–分别是取交集和取减集 |
方括号[ ]的嵌套使用,表示并集,如:[[a-z][A-Z][0-9]],也可以不加括号直接写成[a-zA-Z0-9] |
表格 |
---|
| 表示或 |
* 表示需要匹配一个字符 |
+ 表示需要匹配一次或以上 |
? 表示需要匹配0个或一个字符 |
{n} 表示需要匹配n个字符 |
{n,} 表示需啊哟匹配至少n个字符 |
{n,m} 表示需要匹配不少于n个、不多于m个字符 |
以上2到7行的操作符后加问号? 表示reluctant勉强的(如{n,m}?),在后面加加号+表示possessive独占的,或者刚好的(如{n,}+)。如果不加任何东西保持原样,表示greedy,贪婪的。具体这三种状态的区别,见这里。在正则表达式的文档中建议使用独占的,意义比较明确,降低发生错误的可能。 |
字符 | 描述 | 使用范围是在方括号[ ]内,还是外 |
---|---|---|
. | 匹配任意字符。 | 外 |
\ | 将紧跟其后的字符(可能原本是系统保留的操作符)变为普通字符。必须使用\的字符有* ?+ [ ( ) { } ^ $ | \ . 。 | 内 |
\ | 将紧跟其后的字符(可能原本是系统保留的操作符)变为普通字符。必须使用的\的字符有[ ] \ 。 | 外 |
^ | 表示从第一个字符开始就要与格式匹配(不要与集合[ ]里面的用法混淆)。 | 外 |
$ | 表示结尾要和格式匹配 | 外 |
\d | 表示十进制数 | both |
\D | 表示除十进制数以外的字符 | both |
\uhhhh | 表示4位十六进制数值 | both |
\Uhhhhhhhh | 表示8位的十六进制数 | both |
\x{hhhh} | 表示1到6位的十六进制数 | both |
\xhh | 表示2位十六进制数 | both |
\0ooo | 表示1到3位的八进制数,如0123,0是必须的 | bot |
\s | 表示空格字符 | both |
\S | 表示非空格字符 | both |
还有很多。。。今天先不写了。。