Синтаксис строки формата предиката
Эта статья описывает синтаксис строки предиката и некоторые аспекты синтаксического анализатора предиката.
Строка синтаксического анализатора отличается от строкового выражения, переданного regex механизму. Эта статья описывает текст синтаксического анализатора, не синтаксис для regex механизма.
Основы синтаксического анализатора
Строковый синтаксический анализатор предиката является пробелом, нечувствительным, нечувствительным к регистру относительно ключевых слов, и поддерживает вложенные вводные выражения. Синтаксический анализатор не выполняет семантическую проверку типа.
Переменные обозначены со знаком доллара ($
) символ (например, $VARIABLE_NAME
). Вопросительный знак (?
) символ не является допустимым маркером синтаксического анализатора.
Поддержки строки формата printf
- разработайте спецификаторы формата такой как %x
(см. Строковые Объекты Форматирования). Два важных спецификатора формата %@
и %K
.
%@
замена аргумента var на объектное значение — часто строка, число или дата.%K
замена аргумента var на ключевой путь.
Когда строковыми переменными заменяют в строку с помощью %@
спецификатор формата, они окружаются кавычками. Если Вы хотите указать имя динамического свойства, использовать %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]; |
Основные сравнения
Левое выражение равно правому выражению.
Левое выражение больше, чем или равно правому выражению.
Левое выражение меньше чем или равно правому выражению.
Левое выражение больше, чем правое выражение.
Левое выражение является меньше, чем правое выражение.
Левое выражение не равно правому выражению.
Левое выражение между, или равно любому из, значения, указанные в правой стороне.
Правая сторона является двумя массивами значения (массив требуется, чтобы указывать порядок), предоставление верхних и нижних границ. Например,
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");
}
=
, ==
>=
, =>
<=
, =<
>
<
!=
, <>
BETWEEN
Предикаты булева значения
Предикат, всегда оценивающий к
TRUE
.Предикат, всегда оценивающий к
FALSE
.
TRUEPREDICATE
FALSEPREDICATE
Основные составные предикаты
Логический AND.
Логический OR.
Логичный НЕТ.
AND
, &&
OR
, ||
NOT
, !
Сравнения строк
Сравнения строк являются, по умолчанию, случаем и чувствительным диакритическим знаком. Можно изменить оператора, использующего ключевые символы c
и d
в квадратных скобках для указания случая и диакритической нечувствительности соответственно, например firstName BEGINSWITH[cd] $FIRST_NAME
.
Левое выражение начинается с правого выражения.
Левое выражение содержит правое выражение.
Левое выражение заканчивается правым выражением.
Левое выражение равняется правому выражению:
?
и*
позволяются как подстановочные символы, где?
соответствия1
символ и*
соответствия0
или больше символов.Левое выражение равняется правому выражению с помощью a
regex
- сравнение стиля согласно ICU v3 (для большего количества подробных данных см. Руководство пользователя ICU для Регулярных выражений).Левым параметром этому оператору является выражение, оценивающее к универсальному идентификатору типа (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), который Вы хотите соответствовать. Правым параметром является выражение, оценивающее к UTI. Сравнение оценивает к
TRUE
если UTI, возвращенный левым выражением, равняется UTI, возвращенному правым выражением.Пункт
A UTI-EQUALS B
обеспечивает тот же результат как использованиеUTTypeEqual
метод следующим образом:UTTypeEqual (A, B)
Посмотрите пример кода в
UTI-CONFORMS-TO
запись, применяющаяся также кUTI-EQUALS
оператор путем замены оператора.
BEGINSWITH
CONTAINS
ENDSWITH
LIKE
MATCHES
UTI-CONFORMS-TO
UTI-EQUALS
Совокупные операции
Указывает любой из элементов в следующем выражении. Например,
ANY children.age < 18
.Указывает все элементы в следующем выражении. Например,
ALL children.age < 18
.Не указывает ни один из элементов в следующем выражении. Например,
NONE children.age < 18
. Это логически эквивалентноNOT (ANY ...)
.Эквивалентный операции SQL IN, левая сторона должна появиться в наборе, указанном правой стороной.
Например,
name IN { 'Ben', 'Melissa', 'Nick' }
. Набор может быть массивом, набором или словарем — в случае словаря, его значения используются.В Objective C Вы могли создать предикат IN как показано в следующем примере:
NSPredicate *inPredicate =
[NSPredicate predicateWithFormat: @"attribute IN %@", aCollection];
где
aCollection
может быть экземплярNSArray
,NSSet
,NSDictionary
, или любого из соответствующих непостоянных классов.Указывает элемент в указанном индексе в массиве
array
.Указывает первый элемент в массиве
array
.Указывает последний элемент в массиве
array
.Указывает размер массива
array
.
ANY
, SOME
ALL
NONE
IN
array[index]
array[FIRST]
array[LAST]
array[SIZE]
Идентификаторы
Любые C разрабатывают идентификатор, который не является зарезервированным словом.
Используемый для выхода из зарезервированного слова в идентификатор пользователя.
Используемый для выхода из восьмеричного числа (
\
сопровождаемый 3 восьмеричными цифрами).Используемый для выхода из шестнадцатеричного числа (
\x
или\X
сопровождаемый 2 шестнадцатеричными цифрами).Используемый для выхода из числа Unicode (
\u
или\U
сопровождаемый 4 шестнадцатеричными цифрами).
- C разрабатывают идентификатор
- #symbol
- [\] {octaldigit} {3}
- [\] [xX] {hexdigit} {2}
- [\] [uU] {hexdigit} {4}
Литералы
Одинарные и двойные кавычки приводят к тому же результату, но они не завершают друг друга. Например, "abc"
и 'abc'
идентичны, тогда как "a'b'c"
эквивалентно разделенной пробелом связи a
, 'b'
, c
.
Логическая ложь.
Логическая истина.
Нулевое значение.
Представляет оцениваемый объект.
Символьная строка.
Символьная строка.
Например,
{ 'comma', 'separated', 'literal', 'array' }
.Например,
1
,27
,2.71828
,19.75
.Например,
9.2e-5
.Префикс раньше обозначал шестнадцатеричную последовательность цифры.
Префикс раньше обозначал восьмеричную последовательность цифры.
Префикс раньше обозначал последовательность двоичной цифры.
FALSE
, NO
TRUE
, YES
NULL
, NIL
SELF
"text"
'text'
- Разделенный от запятой литеральный массив
- Стандартное целое число и представления с фиксированной точкой
- Нотация с плавающей точкой с возведением в степень
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