Predicate Format String Syntax

相关链接: https://nshipster.cn/nspredicate/
官方文档链接:https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-SW1
This article describes the syntax of the predicate string and some aspects of the predicate parser.

  • 本文描述了谓词字符串的语法和谓词解析器的一些方面。

The parser string is different from a string expression passed to the regex engine. This article describes the parser text, not the syntax for the regex engine.

  • 解析器字符串与传递给正则表达式引擎的字符串表达式不同。 本文介绍了解析器文本,而不是正则表达式引擎的语法。

Parser Basics

The predicate string parser is whitespace insensitive, case insensitive with respect to keywords, and supports nested parenthetical expressions. The parser does not perform semantic type checking.

  • 谓词字符串解析器对空格不敏感,对关键字不区分大小写,并支持嵌套的括号表达式。 解析器不执行语义类型检查。

Variables are denoted with a dollar-sign ($) character (for example, $VARIABLE_NAME). The question mark (?) character is not a valid parser token.

  • 变量用美元符号($)字符表示(例如,$ VARIABLE_NAME)。 问号(?)字符不是有效的解析器标记。

The format string supports printf-style format specifiers such as %x (see Formatting String Objects). Two important format specifiers are %@ and %K.
格式字符串支持printf样式的格式说明符,例如%x(请参阅格式化字符串对象)。 两个重要的格式说明符是%@和%K。

  • %@ is a var arg substitution for an object value—often a string, number, or date.
    %@是对象值的var arg替换 - 通常是字符串,数字或日期。

  • %K is a var arg substitution for a key path.
    %K是密钥路径的var arg替换。

When string variables are substituted into a string using the %@ format specifier, they are surrounded by quotation marks. If you want to specify a dynamic property name, use %K in the format string, as shown in the following example.

  • 使用%@格式说明符将字符串变量替换为字符串时,它们被引号括起来。 如果要指定动态属性名称,请在格式字符串中使用%K,如以下示例所示。
NSString *attributeName  = @"firstName";
NSString *attributeValue = @"Adam";
NSPredicate *predicate   = [NSPredicate predicateWithFormat:@"%K like %@",
        attributeName, attributeValue];

The predicate format string in this case evaluates to firstName like "Adam".

  • 在这种情况下,谓词格式字符串的计算结果为firstName,如“Adam”。

Single or double quoting variables (or substitution variable strings) cause %@, %K, or $variable to be interpreted as a literal in the format string and so prevent any substitution. In the following example, the predicate format string evaluates to firstName like "%@" (note the single quotes around %@).

  • 单引号或双引号变量(或替换变量字符串)会导致%@,%K或$变量被解释为格式字符串中的文字,因此可以防止任何替换。 在以下示例中,谓词格式字符串的计算结果为firstName,如“%@”(请注意%@周围的单引号)。
NSString *attributeName = @"firstName";
NSString *attributeValue = @"Adam";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like '%@'",
        attributeName, attributeValue];

Important: Use a %@ format specifier only to represent an expression. Do not use it to represent an entire predicate.

  • 要点:仅使用%@格式说明符表示表达式。 不要用它来表示整个谓词。

If you attempt to use a format specifier to represent an entire predicate, the system raises an exception.

  • 如果尝试使用格式说明符表示整个谓词,则系统会引发异常。

Basic Comparisons

=, ==, The left-hand expression is equal to the right-hand expression.

  • 左表达式等于右表达式。

>=, =>, The left-hand expression is greater than or equal to the right-hand expression.

  • 左表达式大于或等于右表达式。

<=, =<, The left-hand expression is less than or equal to the right-hand expression.

  • 左表达式小于或等于右表达式。

>, The left-hand expression is greater than the right-hand expression.

  • 左表达式大于右表达式。

<, The left-hand expression is less than the right-hand expression.

  • 左表达式小于右表达式。

!=, <>, The left-hand expression is not equal to the right-hand expression.
左表达式不等于右表达式。

BETWEEN
The left-hand expression is between, or equal to either of, the values specified in the right-hand side.
左表达式在右指定的值之间或等于任何一个值。

The right-hand side is a two value array (an array is required to specify order) giving upper and lower bounds. For example, 1 BETWEEN { 0 , 33 }, or $INPUT BETWEEN {$LOWER, $UPPER }.
In Objective-C, you could create a BETWEEN predicate as shown in the following example:

  • 右侧是一个两值数组(需要一个数组来指定顺序),给出上限和下限。 例如,1 BETWEEN {0,33}或$ INPUT BETWEEN {$LOWER,$UPPER}。
    在Objective-C中,您可以创建BETWEEN谓词,如以下示例所示:
NSPredicate *betweenPredicate =
    [NSPredicate predicateWithFormat: @"attributeName BETWEEN %@", @[@1, @10]];

This creates a predicate that matches ( ( 1 <= attributeValue ) && ( attributeValue <= 10 ) ), as illustrated in the following example:

  • 这将创建一个匹配((1 <= attributeValue)&&(attributeValue <= 10))的谓词,如以下示例所示:
NSPredicate *betweenPredicate =
    [NSPredicate predicateWithFormat: @"attributeName BETWEEN %@", @[@1, @10]];
 
NSDictionary *dictionary = @{ @"attributeName" : @5 };
 
BOOL between = [betweenPredicate evaluateWithObject:dictionary];
if (between) {
    NSLog(@"between");
}

Boolean Value Predicates

TRUEPREDICATE
A predicate that always evaluates to TRUE.

  • 始终计算为TRUE的谓词。
    FALSEPREDICATE

A predicate that always evaluates to FALSE.

  • 一个总是计算为FALSE的谓词。

Basic Compound Predicates

AND, &&
Logical AND.

OR, ||
Logical OR.

NOT, !
Logical NOT.

String Comparisons

String comparisons are, by default, case and diacritic sensitive. You can modify an operator using the key characters c and d within square braces to specify case and diacritic insensitivity respectively, for example firstName BEGINSWITH[cd] $FIRST_NAME.

  • 默认情况下,字符串比较是大小写和变音符号敏感的。 您可以使用方括号内的键字符c和d修改运算符,以分别指定大小写和变音符号不敏感,例如firstName BEGINSWITH [cd] $ FIRST_NAME。

BEGINSWITH
The left-hand expression begins with the right-hand expression.

  • 左表达式以右表达式开头。

CONTAINS
The left-hand expression contains the right-hand expression.

  • 左侧表达式包含右侧表达式。

ENDSWITH
The left-hand expression ends with the right-hand expression.
-左侧表达以右侧表达结束。

LIKE
The left hand expression equals the right-hand expression: ? and * are allowed as wildcard characters, where ? matches 1 character and * matches 0 or more characters.

  • 左侧表达式等于右侧表达式:?*被允许作为通配符,条件?允许匹配1个字符,*匹配0个或更多字符。

MATCHES
The left hand expression equals the right hand expression using a regex-style comparison according to ICU v3 (for more details see the ICU User Guide for Regular Expressions).

  • 根据ICU v3,左侧表达式使用正则表达式比较等于右侧表达(有关详细信息,请参阅ICU用户指南中的正则表达式)。

UTI-CONFORMS-TO
The left hand argument to this operator is an expression that evaluates to a universal type identifier (UTI) you want to match. The right hand argument is an expression that evaluates to a UTI. The comparison evaluates to TRUE if the UTI returned by the left hand expression conforms to the UTI returned by the right hand expression. For information on which types conform to a given type, see System-Declared Uniform Type Identifiers in Uniform Type Identifiers

  • 此运算符的左侧参数是一个表达式,其计算结果为您要匹配的通用类型标识符(UTI)。 右手参数是一个评估为UTI的表达式。 如果左手表达式返回的UTI符合右手表达式返回的UTI,则比较结果为TRUE。 有关哪些类型符合给定类型的信息,请参阅统一类型标识符中的系统声明的统一类型标识符

The clause A UTI-CONFORMS-TO B provides the same result as employing the UTTypeConformsTo method as follows:

  • A UTI-CONFORMS-TO B子句提供与使用UTTypeConformsTo方法相同的结果,如下所示:
UTTypeConformsTo (A, B)

When evaluating attachments in an app extension item (of type NSExtensionItem), you could use a statement similar to the following:

  • 在评估应用程序扩展项(NSExtensionItem类型)中的附件时,您可以使用类似于以下内容的语句:
SUBQUERY (
    extensionItems,
    $extensionItem,
    SUBQUERY (
        $extensionItem.attachments,
        $attachment,
        ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf"
    ).@count == $extensionItem.attachments.@count
).@count == 1

UTI-EQUALS
The left hand argument to this operator is an expression that evaluates to a universal type identifier (UTI) you want to match. The right hand argument is an expression that evaluates to a UTI. The comparison evaluates to TRUE if the UTI returned by the left hand expression equals the UTI returned by the right hand expression.

  • 此运算符的左侧参数是一个表达式,其计算结果为您要匹配的通用类型标识符(UTI)。 右侧参数是一个评估为UTI的表达式。 如果左侧表达式返回的UTI等于右侧表达式返回的UTI,则比较结果为TRUE。

The clause A UTI-EQUALS B provides the same result as employing the UTTypeEqual method as follows:

  • A UTI-EQUALS B子句提供与使用UTTypeEqual方法相同的结果,如下所示:
UTTypeEqual (A, B)

See the code example in the UTI-CONFORMS-TO entry, which applies as well to the UTI-EQUALS operator by replacing the operator.

  • 请参阅UTI-CONFORMS-TO条目中的代码示例,该条目通过替换运算符也适用于UTI-EQUALS运算符。

Aggregate Operations 聚合操作

ANY, SOME
Specifies any of the elements in the following expression. For example ANY children.age < 18.

  • 指定以下表达式中的任何元素。 例如,任何children.age <18。

ALL
Specifies all of the elements in the following expression. For example ALL children.age < 18.

  • 指定以下表达式中的所有元素。 例如,所有children.age <18。

NONE
Specifies none of the elements in the following expression. For example, NONE children.age < 18. This is logically equivalent to NOT (ANY ...).

  • 不指定以下表达式中的元素。 例如,NONE children.age <18。这在逻辑上等同于NOT(ANY ...)。

IN
Equivalent to an SQL IN operation, the left-hand side must appear in the collection specified by the right-hand side.

  • 相当于SQL IN操作,左侧必须出现在右侧指定的集合中。

For example, name IN { 'Ben', 'Melissa', 'Nick' }. The collection may be an array, a set, or a dictionary—in the case of a dictionary, its values are used.

  • 例如,名字IN {'Ben','Melissa','Nick'}。 集合可以是数组,集合或字典 - 在字典的情况下,使用其值。

In Objective-C, you could create a IN predicate as shown in the following example:

  • 在Objective-C中,您可以创建一个IN谓词,如以下示例所示:
NSPredicate *inPredicate =
            [NSPredicate predicateWithFormat: @"attribute IN %@", aCollection];

where aCollection may be an instance of NSArray, NSSet, NSDictionary, or of any of the corresponding mutable classes.

  • 其中aCollection可以是NSArray,NSSet,NSDictionary或任何相应的可变类的实例。

array[index]
Specifies the element at the specified index in the array array.

  • 指定数组数组中指定索引处的元素。

array[FIRST]
Specifies the first element in the array array.

  • 指定数组数组中的第一个元素。

array[LAST]
Specifies the last element in the array array.
指定数组数组中的最后一个元素。

array[SIZE]
Specifies the size of the array array.

  • 指定数组数组的大小。
    Identifiers

C style identifier
Any C style identifier that is not a reserved word.

  • 任何不是保留字的C样式标识符。

symbol

Used to escape a reserved word into a user identifier.

  • 用于将保留字转义为用户标识符。

[]{octaldigit}{3}
Used to escape an octal number ( \ followed by 3 octal digits).

  • 用于转义八进制数字(\后跟3个八进制数字)。

[][xX]{hexdigit}{2}
Used to escape a hex number ( \x or \X followed by 2 hex digits).

  • 用于转义十六进制数字(\ x或\ X后跟2个十六进制数字)。

[][uU]{hexdigit}{4}
Used to escape a Unicode number ( \u or \U followed by 4 hex digits).

  • 用于转义Unicode编号(\ u或\ U后跟4个十六进制数字)。
    Literals

Single and double quotes produce the same result, but they do not terminate each other. For example, "abc" and 'abc' are identical, whereas "a'b'c" is equivalent to a space-separated concatenation of a, 'b', c.

  • 单引号和双引号产生相同的结果,但它们不会相互终止。 例如,“abc”和“abc”是相同的,而“a'b'c”相当于a,'b',c的空格分隔的连接。

FALSE, NO
Logical false.

TRUE, YES
Logical true.

NULL, NIL
A null value.

SELF
Represents the object being evaluated.

"text"
A character string.

'text'
A character string.

Comma-separated literal array
For example, { 'comma', 'separated', 'literal', 'array' }.

Standard integer and fixed-point notations
For example, 1, 27, 2.71828, 19.75.

Floating-point notation with exponentiation
For example, 9.2e-5.

0x
Prefix used to denote a hexadecimal digit sequence.

  • 前缀用于表示十六进制数字序列。

0o
Prefix used to denote an octal digit sequence.
-前缀用于表示八进制数字序列。

0b
Prefix used to denote a binary digit sequence.

  • 前缀用于表示二进制数字序列。

Reserved Words

The following words are reserved:

AND, OR, IN, NOT, ALL, ANY, SOME, NONE, LIKE, CASEINSENSITIVE, CI, MATCHES, CONTAINS, BEGINSWITH, ENDSWITH, BETWEEN, NULL, NIL, SELF, TRUE, YES, FALSE, NO, FIRST, LAST, SIZE, ANYKEY, SUBQUERY, FETCH, CAST, TRUEPREDICATE, FALSEPREDICATE, UTI-CONFORMS-TO, UTI-EQUALS,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,319评论 0 10
  • 不得不承认的是,企业处理危机公关不仅仅是一门技术,更像是一门艺术。由于处理不当,最终导致企业“轰然倒下”的案例也不...
    5b0eba5323ac阅读 246评论 0 0
  • 忙碌了一天,踏入月夜,穿走过十几条街,慢步在宅水相依的平江路。 这是一条平实的石板路,它既无朱家角的人...
    LECAMELIA阅读 307评论 0 2
  • 十年寒窗的学子终于今天完成了高考,表妹昨天给我打电话聊天问报读什么专业以后出来好找工作然后说要先出来玩...
    K王之姐阅读 350评论 0 0
  • 我想很多人会认为: 假如记忆可以移植,那么我可以成为科学家; 假如记忆可以移植,那么我可以成为艺术家; 假如记忆可...
    鹤一张阅读 397评论 1 1