Синтаксис строки формата предиката

Эта статья описывает синтаксис строки предиката и некоторые аспекты синтаксического анализатора предиката.

Строка синтаксического анализатора отличается от строкового выражения, переданного regex механизму. Эта статья описывает текст синтаксического анализатора, не синтаксис для regex механизма.

Основы синтаксического анализатора

Строковый синтаксический анализатор предиката является пробелом, нечувствительным, нечувствительным к регистру относительно ключевых слов, и поддерживает вложенные вводные выражения. Синтаксический анализатор не выполняет семантическую проверку типа.

Переменные обозначены со знаком доллара ($) символ (например, $VARIABLE_NAME). Вопросительный знак (?) символ не является допустимым маркером синтаксического анализатора.

Поддержки строки формата printf- разработайте спецификаторы формата такой как %x (см. Строковые Объекты Форматирования). Два важных спецификатора формата %@ и %K.

Когда строковыми переменными заменяют в строку с помощью %@ спецификатор формата, они окружаются кавычками. Если Вы хотите указать имя динамического свойства, использовать %K в строке формата, как показано в следующем примере.

NSString *attributeName  = @"firstName";
NSString *attributeValue = @"Adam";
NSPredicate *predicate   = [NSPredicate predicateWithFormat:@"%K like %@",
        attributeName, attributeValue];

Строка формата предиката в этом случае оценивает к firstName like "Adam".

Единственные или двойные переменные заключения в кавычки (или переменные строки замены) причина %@, %K, или $variable чтобы быть интерпретированным как литерал в строке формата и тем самым предотвращают любую замену. В следующем примере строка формата предиката оценивает к firstName like "%@" (отметьте одинарные кавычки вокруг %@).

NSString *attributeName = @"firstName";
NSString *attributeValue = @"Adam";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like '%@'",
        attributeName, attributeValue];

Основные сравнения

=, ==

Левое выражение равно правому выражению.

>=, =>

Левое выражение больше, чем или равно правому выражению.

<=, =<

Левое выражение меньше чем или равно правому выражению.

>

Левое выражение больше, чем правое выражение.

<

Левое выражение является меньше, чем правое выражение.

!=, <>

Левое выражение не равно правому выражению.

BETWEEN

Левое выражение между, или равно любому из, значения, указанные в правой стороне.

Правая сторона является двумя массивами значения (массив требуется, чтобы указывать порядок), предоставление верхних и нижних границ. Например, 1 BETWEEN { 0 , 33 }, или $INPUT BETWEEN { $LOWER, $UPPER }.

В Objective C Вы могли создать предикат BETWEEN как показано в следующем примере:

NSPredicate *betweenPredicate =
    [NSPredicate predicateWithFormat: @"attributeName BETWEEN %@", @[@1, @10]];

Это создает соответствующий предикат ( ( 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");
}

Предикаты булева значения

TRUEPREDICATE

Предикат, всегда оценивающий к TRUE.

FALSEPREDICATE

Предикат, всегда оценивающий к FALSE.

Основные составные предикаты

AND, &&

Логический AND.

OR, ||

Логический OR.

NOT, !

Логичный НЕТ.

Сравнения строк

Сравнения строк являются, по умолчанию, случаем и чувствительным диакритическим знаком. Можно изменить оператора, использующего ключевые символы c и d в квадратных скобках для указания случая и диакритической нечувствительности соответственно, например firstName BEGINSWITH[cd] $FIRST_NAME.

BEGINSWITH

Левое выражение начинается с правого выражения.

CONTAINS

Левое выражение содержит правое выражение.

ENDSWITH

Левое выражение заканчивается правым выражением.

LIKE

Левое выражение равняется правому выражению: ? и * позволяются как подстановочные символы, где ? соответствия 1 символ и * соответствия 0 или больше символов.

MATCHES

Левое выражение равняется правому выражению с помощью a regex- сравнение стиля согласно ICU v3 (для большего количества подробных данных см. Руководство пользователя ICU для Регулярных выражений).

UTI-CONFORMS-TO

Левым параметром этому оператору является выражение, оценивающее к универсальному идентификатору типа (UTI), который Вы хотите соответствовать. Правым параметром является выражение, оценивающее к UTI. Сравнение оценивает к TRUE если UTI, возвращенный левым выражением, соответствует UTI, возвращенному правым выражением. Для получения информации о котором типы соответствуют данному типу, видят Объявленные системой Универсальные Идентификаторы типов в Универсальной Ссылке Идентификаторов типов. Чтобы изучить, как объявить соответствие к пользовательскому UTI, посмотрите Объявление Новых Универсальных Идентификаторов типов в Универсальном Обзоре Идентификаторов типов.

Пункт A UTI-CONFORMS-TO B обеспечивает тот же результат как использование UTTypeConformsTo метод следующим образом:

UTTypeConformsTo (A, B)

При оценке присоединений в элементе расширения приложения (типа 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

Левым параметром этому оператору является выражение, оценивающее к универсальному идентификатору типа (UTI), который Вы хотите соответствовать. Правым параметром является выражение, оценивающее к UTI. Сравнение оценивает к TRUE если UTI, возвращенный левым выражением, равняется UTI, возвращенному правым выражением.

Пункт A UTI-EQUALS B обеспечивает тот же результат как использование UTTypeEqual метод следующим образом:

UTTypeEqual (A, B)

Посмотрите пример кода в UTI-CONFORMS-TO запись, применяющаяся также к UTI-EQUALS оператор путем замены оператора.

Совокупные операции

ANY, SOME

Указывает любой из элементов в следующем выражении. Например, ANY children.age < 18.

ALL

Указывает все элементы в следующем выражении. Например, ALL children.age < 18.

NONE

Не указывает ни один из элементов в следующем выражении. Например, NONE children.age < 18. Это логически эквивалентно NOT (ANY ...).

IN

Эквивалентный операции SQL IN, левая сторона должна появиться в наборе, указанном правой стороной.

Например, name IN { 'Ben', 'Melissa', 'Nick' }. Набор может быть массивом, набором или словарем — в случае словаря, его значения используются.

В Objective C Вы могли создать предикат IN как показано в следующем примере:

NSPredicate *inPredicate =
            [NSPredicate predicateWithFormat: @"attribute IN %@", aCollection];

где aCollection может быть экземпляр NSArray, NSSet, NSDictionary, или любого из соответствующих непостоянных классов.

array[index]

Указывает элемент в указанном индексе в массиве array.

array[FIRST]

Указывает первый элемент в массиве array.

array[LAST]

Указывает последний элемент в массиве array.

array[SIZE]

Указывает размер массива array.

Идентификаторы

C разрабатывают идентификатор

Любые C разрабатывают идентификатор, который не является зарезервированным словом.

#symbol

Используемый для выхода из зарезервированного слова в идентификатор пользователя.

[\] {octaldigit} {3}

Используемый для выхода из восьмеричного числа ( \ сопровождаемый 3 восьмеричными цифрами).

[\] [xX] {hexdigit} {2}

Используемый для выхода из шестнадцатеричного числа ( \x или \X сопровождаемый 2 шестнадцатеричными цифрами).

[\] [uU] {hexdigit} {4}

Используемый для выхода из числа Unicode ( \u или \U сопровождаемый 4 шестнадцатеричными цифрами).

Литералы

Одинарные и двойные кавычки приводят к тому же результату, но они не завершают друг друга. Например, "abc" и 'abc' идентичны, тогда как "a'b'c" эквивалентно разделенной пробелом связи a, 'b', c.

FALSE, NO

Логическая ложь.

TRUE, YES

Логическая истина.

NULL, NIL

Нулевое значение.

SELF

Представляет оцениваемый объект.

"text"

Символьная строка.

'text'

Символьная строка.

Разделенный от запятой литеральный массив

Например, { 'comma', 'separated', 'literal', 'array' }.

Стандартное целое число и представления с фиксированной точкой

Например, 1, 27, 2.71828, 19.75.

Нотация с плавающей точкой с возведением в степень

Например, 9.2e-5.

0x

Префикс раньше обозначал шестнадцатеричную последовательность цифры.

0o

Префикс раньше обозначал восьмеричную последовательность цифры.

0b

Префикс раньше обозначал последовательность двоичной цифры.

Зарезервированные слова

Следующие слова резервируются:

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, CAST, TRUEPREDICATE, FALSEPREDICATE, UTI-CONFORMS-TO, UTI-EQUALS