Предикат сопоставления
Функция
Определение соответствия шаблону регулярного выражения.
Спецификация
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
| [символ сопоставления ...]
| [^символ сопоставления ...]
| [включаемый символ сопоставления ...^исключаемый символ сопоставления ...]
::=
::=
::=
::=
::=
Синтаксические правила
-
< Символьное выражение >
и< регулярное выражение >
должны иметь строковый тип данных или приводиться к нему. -
Значением
< ESC-символа >
должен быть односимвольный литерал, кроме: '[', ']', '(', ')', '|', '^', '-', '+', '*', '_', '%' , '?', '{', '}'. -
По умолчанию в качестве
< ESC-символа >
используется символ '\'. -
Недопустимо использование
< ESC-символа >
в следующих случаях:-
< ESC-символ >
равен «:», и при этом используются конструкции вида [:alpha:]; -
в функции
SUBSTRING
, когда количество символов двойной кавычки «"», «прикрытых»< ESC-символом >
, меньше двух, например:select substring('This is not line22' similar 'This is \"[[:ALPHA:]]+[[:DIGIT:]]+' escape '\');
где нет второй последовательности из закрытой слэшем двойной кавычки (\").
-
-
< Регулярное выражение >
задается, как правило, литералом соответствующего типа. -
Создаваемое по приведенным правилам регулярное выражение представляет собой символьное значение, содержащее все символы, которые требуется явно сопоставлять с символами значения-источника.
-
При вычислении регулярного выражения образуются все возможные символьные значения, не содержащие специальных символов и соответствующие исходному шаблону.
-
Любой символ обозначает себя самого, если это не метасимвол.
-
Метасимволы шаблона обозначают группу других метасимволов.
-
Метасимвол _ заменяет один символ.
select count(*) from auto where make similar to 'B_W'; | 10|
-
Метасимвол % заменяет произвольное количество символов.
select count(*) from auto where make similar to 'F%D'; | 118|
-
Альтернативные последовательности разделяются символом < вертикальная черта > ('|'). Внутри квадратных скобок это обычный символ.
select count(*) from auto where color similar to 'B%|GR_'; | 416|
-
Конструкция
< повторение >
задает количество повторений< первичного регулярного выражения >
. -
Показатель числа повторений можно также задать с помощью выражения в фигурных скобках. Например:
-
{m} – повторение ровно m раз;
-
{m,} – повторение не менее m раз;
-
{m,n} – повторение не менее m раз и не более n раз.
Значения n и m не могут быть больше 65536.
select count(*) from auto where make similar to 'FER{2,3}_RI'; | 30|
select count(*) from auto where make similar to 'FER{2}_RI'; | 30|
select count(*) from auto where make similar to 'FER{2,}_RI'; | 30|
-
-
Квадратные скобки представляют собой один из вариантов определения набора символов – через перечисление символов. При вычислении регулярного выражения в каждом из генерируемых символьных значений конструкция в квадратных скобках заменяется одним из символов соответствующего набора. Определяемый набор символов может задаваться нижней и верхней границей диапазона допустимых символов.
Например, в регулярном выражении 'string [3-8]' конструкция в квадратных скобках представляет собой любой одиночный символ, изображающий цифры от 3 до 8 включительно.
-
При задании диапазона значений можно использовать любые символы, но требуется, чтобы значение кода символа
< нижней границы >
диапазона было не больше значения кода символа< верхней границы >
. -
Сравнивается вес символов.
-
Набор символов можно определять с помощью
< идентификатора набора символов >
:-
ALPHA – любой символ алфавита;
-
UPPER – любой символ верхнего регистра;
-
LOWER – любой символ нижнего регистра;
-
ALNUM – любой алфавитно-цифровой символ;
-
SPACE – символ пробела;
-
WHITESPACE – любой из символов с кодами U+0009 (Horizontal Tabulation), U+000A (Line Feed), U+000B (Vertical Tabulation), U+000C (Form Feed), U+000D (Carriage Return), U+0085 (Next Line));
-
DIGIT – любая одиночная десятичная цифра.
select distinct make from auto where make similar to '_[[:alpha:]]R{2,}A[[:alpha:]]{2}'; |FERRARI |
select count(*) from auto where model similar to '%[[:digit:]]'; | 280|
-
-
< Символ сопоставления >
можно задавать в виде диапазона символов, например, a-z, 0-9 – цифра и т.д. -
Метасимвол ^ обозначает начало исключаемого из сопоставления значения (набор символов).
Например, регулярное выражение '_S[^t]*ing%' генерирует все символьные значения, где вторым символом является "S", за которым (не обязательно непосредственно) следует символьное значение "ing", но между "S" и "ing" отсутствуют вхождения символа "t".
create or replace table test(id int, ch char(15)); insert into test values(1, 'String'); insert into test values(2, 'String main'); insert into test values(3, 'Swing'); insert into test values(4, 'Sorting'); insert into test values(5, 'String main'); insert into test values(6, 'Spring'); insert into test values(7, 'Spring ability'); select id, ch from test where ch similar to 'S[^t]*ing%'; ID CH -- -- | 3|Swing | | 6|Spring | | 7|Spring ability |
-
После символа ^ можно указать несколько наборов символов, которые не должны входить в определяемый набор, например: '_S[a-x^to-p]*ing%' – в данном случае за символом "S" могут стоять символы из диапазона "a-x", но при этом в определяемый набор не должен входить не только символ "t", но и символы из диапазона "o-p".
select count(*) from auto where 'ain56eing5' similar to '[[:alpha:]65^fgh]+ing*5'; | 1000|
-
Круглые скобки () используются для группировки элементов в один логический элемент. В общем случае в круглых скобках могут находиться произвольные регулярные выражения.
select count(*) from auto where '034' similar to '0(1|2|3)4|5(6|7)8'; | 1000|
-
< ESC-символ >
, поставленный перед любым метасимволом, отменяет специальную интерпретацию этого метасимвола.select count(*) from auto where 'HARDWARE_123' similar to '(HARD|SOFT)WARE%\_[:DIGIT:]+' escape '\'; | 100|
-
Если в шаблоне присутствует конструкция в квадратных скобках с использованием двоеточия, то
< ESC-символом >
не может быть также символ :.select count(*) from auto where '}}}' similar to '\}\}\}';
-
Метасимволы имеют модификаторы (пишутся после метасимвола):
-
* – элемент регулярного выражения, непосредственно предшествующий символу '*', может появляться ноль или более раз. '*' эквивалентна {0,}.
Выражение 'string [56]*' генерирует символьные значения 'string', 'string 5', 'string 6', 'string 55', 'string 66', 'string 56', 'string 65', 'string 555' и т.д.
-
+ – элемент регулярного выражения, непосредственно предшествующий символу '+', может появляться ноль или более раз. '+' эквивалентен {1,}.
select count(*) from auto where 'ain56eing5' similar to '[[:alnum:]]+ing*5'; | 1000|
-
? – элемент регулярного выражения, непосредственно предшествующий символу '?', может появляться ноль или 1 раз. '?' эквивалентен {0,1}.
-
-
Проверка совпадения выполняется столько раз, сколько возможно, не учитывая результат действия последующих метасимволов. Для управления количеством совпадений необходимо использовать символ '?'.
Таким образом:
-
*? – 0 и более раз;
-
+? – 1 и более раз;
-
?? – 0 или 1 раз;
-
{n}? – точно n раз;
-
{n,}? – не меньше n раз;
-
{n,m}? – больше или равно n и меньше m раз.
-
Общие правила
-
Значением предиката является TRUE в том и только в том случае, когда среди всех символьных значений, генерируемых по
< шаблону >
регулярного выражения, найдётся символьное значение, совпадающее с< символьным выражением >
.