Cocoa Predicates Classes

Cocoa Predicates类

predicate,论断,一种逻辑表达。论断一个事件成立。可以用在很多地方,比如作为数组的过滤器等等。(边看文档边写)

1. 论断的用途(几个常用的)

  • 判断论断是否成立,成立的话返回真,否则返回假
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"了
  • 和key-Path一起使用
    直接看例子:
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。

  • 和NSFetchRequest一起用
    用法和数组的过滤条件一样,数据提取出来也是以一个数组的形式返回。整个过程涉及到NSFetchRequest、NSEntityDescription、NSError。详细用法这里不介绍。总之论断是作为NSFetchRequest的条件。
  • 和正则表达式一起使用
    MATCHES操作符需要使用正则表达式,在下面会说到。
NSPredicate *catPredicate =
    [NSPredicate predicateWithFormat:@"SELF MATCHES '.*(CAT){3,}(?!CA).*' ""];//这里最后多了一个双引号请忽略,加它只是为了让编辑器正确显示代码的颜色
NSArray *filteredArray = [array filteredArrayUsingPredicate:catPredicate];

2. 创建论断

创建一个论断,需要有论断表达式。

  • 可以用格式化字符串来表示这个表达式。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"format",parameter1,parameter2,...];

这个格式化字符串可以是字符串常量、字符串变量、可以包含通配符,包含布尔值,包含对象。具体语法见下一节。

3. 论断表达式语法

基本格式

  • 变量用$表示,如$VARIABLE_NAME
  • 平时用于string的格式也可以用
  • %@,代表对象
  • %k,表示keyPath

比较

  • !=和<>都表示不等于
  • BETWEEN是否介于两者之间
    格式BETWEEN{ $Lower,$UPPER}
    如1 BETWEEN { 0 , 33 }
NSPredicate *betweenPredicate =
    [NSPredicate predicateWithFormat: @"attributeName BETWEEN %@", @[@1, @10]];

布尔值论断

  • TRUEPREDICATE一直为真的论断
  • FALSEPREDICATE一直为假的论断

复合论断(用于连接两个或以上论断)

AND,&&,OR,||,NOT,! 都可以用

字符串比较相关的论断

  • BEGINSWITH 左边的表达式以右边的表达式开头
  • CONTAINS 左边的表达式包含右边右边的表达式
  • ENDSWITH 左边的表达式以右边的表达式结尾
  • LIKE 左边的表达式等于右边的表达式(表达式中可以使用通配符?和*,?可以替代一个字符,*可以替代0个或多个字符)
  • MATCHES 左边的表达式等于右边的表达式,右边表达式用正则表达式(正则表达式看下一节)
  • UTI-CONFORMS-TO 左边的UTI是否承认右边的UTI
  • UTI-EQUALS 左边和右边的UTI相等

对集合的论断

  • ANY,SOME,ALL,NONE 语义和字面意思一样,比如:
    ANY children.age < 18表示至少有一个children对象的age属性都小于18
    ALL children.age < 14表示所有children对象的age属性都小于18
  • IN 表示在某个范围内,如:
    name IN {'Ben','PanPan','OhYeah'}
    再如:
NSPredicate *inPredicate =
            [NSPredicate predicateWithFormat: @"attribute IN %@", aCollection];
  • array[index],array[FIRST],array[LAST],array[SIZE] 断定某个元素是数组中的第几个元素

标识

  • #symbol 将一个系统保留的关键字symbol转换成普通的用户标识
  • 斜杠\后跟不同个数字表示不同的数,如:
    \456、\x85、\u1234分别表示八进制0456,十六进制0x85,Unicode数0x1234
    上面的x和u大小写都可以

可用于论断表达式的一些表达

  • SELF 表示要进行论断的那个对象
  • FALSE、NO、TRUE、YES 逻辑假 逻辑真
  • NULL、NIL 表示是个空值
  • “text”或’text’ 表示是字符串
  • 逗号隔开的数组
  • 标准整型数和定点数
  • 浮点数
  • 0x 十六进制数前缀
  • 0o 八进制数前缀
  • 0b 二进制数前缀

4. 正则表达式(基本的)

参考这个网站
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

还有很多。。。今天先不写了。。

你可能感兴趣的:(cocoa,正则表达式,Predicates)