Предикаты, синтаксис формата строки
Cocoa
Анализатор строки отличается от строки выражения, переданной движку регулярных выражений. В этой статье описывается анализатор текста, а не синтаксис для движка регулярных выражений.
Основы синтаксического анализатора
Анализатор строки предиката рассматривает пробельные символы, регистр по отношению к ключевым словам, а также поддерживает вложенные скобки выражений. Анализатор не выполняет семантические проверки типов.
Переменные обозначаемые с $
(для примера $VARIABLE_NAME
). ?
не является допустимым шаблоном анализатора.
Формат строки поддерживает printf
стиль формат для аргументов, такие как %x
(см. "Форматирование строковых объектов"). Два важных аргумента: @%
и %K
.
%@
является аргументом замещения для объекта обозначающим чаще всего строку, число или дату.%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 }, or $INPUT BETWEEN { $LOWER, $UPPER }
.
В Objective-C, вы можете создать BETWEEN предикат, как показано в следующем примере:
NSPredicate *betweenPredicate = [NSPredicate predicateWithFormat: @"attributeName BETWEEN %@", [NSArray arrayWithObjects:one, ten, nil]];
( ( 1 <= attributeValue ) && ( attributeValue <= 10 ) )
, как проилюстрированно ниже:NSNumber *one = [NSNumber numberWithInteger:1]; NSNumber *ten = [NSNumber numberWithInteger:10]; NSPredicate *betweenPredicate = [NSPredicate predicateWithFormat: @"attributeName BETWEEN %@", [NSArray arrayWithObjects:one, ten, nil]]; NSNumber *five = [NSNumber numberWithInteger:5]; NSDictionary *dictionary = [NSDictionary dictionaryWithObject:five forKey:@"attributeName"]; BOOL between = [betweenPredicate evaluateWithObject:dictionary]; if (between) { NSLog(@"between"); }
Предикаты булевых значений
TRUEPREDICATE
Предикат, который всегда вычисляется какTRUE
.
FALSEPREDICATE
Предикат, который всегда вычисляется какFALSE
.
Основные соединения предикатов
AND, &&
Логическое AND.
OR, ||
Логическое OR.
NOT, !
Логическое NOT.
Сравнение строк
Сравнение строк по умолчанию регистро и диакритически чувствительны. Вы можете изменить оператор с использованием ключевых символов c и d в квадратных скобках, чтобы указать нечувствительность к регистру и диакритическим символам соответственно, например, firstName BEGINSWITH[cd] $FIRST_NAME
.
BEGINSWITH
Левое выражение начинается с правого выражения.
CONTAINS
Левое выражение содержит правое выражение.
ENDSWITH
Левое выражение оканчивается с правым выражением.
LIKE
Левое выражение равно правому выражению:?
и *
разрешены как символы подстановки, где ?
соответствует 1-му символу а *
соответствует 0 или более символов. В Mac OS X v10.4, подстановочные символы не соответствуют символу новой строки.
MATCHES
Левое выражение равно правому, используя выражение в стиле сравнения регулярных выражений в соответствии с ICU v3.
Совокупные операции
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', 'Matthew' }
. Коллекция может быть массивом, набором, или словарем в случае словаря, используются его значения.
В Objective-C, можно создать предикат, как показано в следующем примере:
NSPredicate *inPredicate = [NSPredicate predicateWithFormat: @"attribute IN %@", aCollection];
aCollection
может быть экземпляром NSArray
, NSSet
, NSDictionary
, или любым изменяемым из соответствующих классов.
array[index]
Определяет элемент по указанному индексу в массивеarray
.
array[FIRST]
Определяет первый элемент в массивеarray
.
array[LAST]
Определяет последний элемент в массивеarray
.
array[SIZE]
Определяет размер массиваarray
.
Идентификаторы
C style identifier
Любой идентификатор в 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
, 21
, 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