Предикат сопоставления

Функция

Определение соответствия шаблону регулярного выражения.

Спецификация
   
< предикат сопоставления >::=
< ESC-символ >::=
одиночный ASCII | UNICODE-символ
< повторение >::=
< нижняя граница >::=
< верхняя граница >::=
< первичное регулярное выражение >::=
< экранированный символ >::=
< специальный символ >::=
любой из символов []()|^-+*%_?{}
< неэкранированный символ >::=
любой символ, отличный от специального символа и не совпадающий с ESC-символом (если он определен)
< включаемый символ сопоставления >::=
< исключаемый символ сопоставления >::=
< идентификатор набора символов >::=
< вертикальная черта >::=
|
Синтаксические правила
  1. < Символьное выражение > и < регулярное выражение > должны иметь строковый тип данных или приводиться к нему.

  2. Значением < ESC-символа > должен быть односимвольный литерал, кроме: '[', ']', '(', ')', '|', '^', '-', '+', '*', '_', '%' , '?', '{', '}'.

  3. По умолчанию в качестве < ESC-символа > используется символ '\'.

  4. Недопустимо использование < ESC-символа > в следующих случаях:

    • < ESC-символ > равен «:», и при этом используются конструкции вида [:alpha:];

    • в функции SUBSTRING, когда количество символов двойной кавычки «"», «прикрытых» < ESC-символом >, меньше двух, например:

      select substring('This is not line22' similar 'This is \"[[:ALPHA:]]+[[:DIGIT:]]+' escape '\'); 

      где нет второй последовательности из закрытой слэшем двойной кавычки (\").

  5. < Регулярное выражение > задается, как правило, литералом соответствующего типа.

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

  7. При вычислении регулярного выражения образуются все возможные символьные значения, не содержащие специальных символов и соответствующие исходному шаблону.

  8. Любой символ обозначает себя самого, если это не метасимвол.

  9. Метасимволы шаблона обозначают группу других метасимволов.

  10. Метасимвол _ заменяет один символ.

    select count(*) from auto where make similar to 'B_W';
    |         10|
  11. Метасимвол % заменяет произвольное количество символов.

    select count(*) from auto where make similar to 'F%D';
    |        118|
  12. Альтернативные последовательности разделяются символом < вертикальная черта > ('|'). Внутри квадратных скобок это обычный символ.

    select count(*) from auto where color similar to 'B%|GR_';
    |        416|
  13. Конструкция < повторение > задает количество повторений < первичного регулярного выражения >.

  14. Показатель числа повторений можно также задать с помощью выражения в фигурных скобках. Например:

    • {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|
  15. Квадратные скобки представляют собой один из вариантов определения набора символов – через перечисление символов. При вычислении регулярного выражения в каждом из генерируемых символьных значений конструкция в квадратных скобках заменяется одним из символов соответствующего набора. Определяемый набор символов может задаваться нижней и верхней границей диапазона допустимых символов.

    Например, в регулярном выражении 'string [3-8]' конструкция в квадратных скобках представляет собой любой одиночный символ, изображающий цифры от 3 до 8 включительно.

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

  17. Сравнивается вес символов.

  18. Набор символов можно определять с помощью < идентификатора набора символов >:

    • 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|
  19. < Символ сопоставления > можно задавать в виде диапазона символов, например, a-z, 0-9 – цифра и т.д.

  20. Метасимвол ^ обозначает начало исключаемого из сопоставления значения (набор символов).

    Например, регулярное выражение '_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 |
  21. После символа ^ можно указать несколько наборов символов, которые не должны входить в определяемый набор, например: '_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|
  22. Круглые скобки () используются для группировки элементов в один логический элемент. В общем случае в круглых скобках могут находиться произвольные регулярные выражения.

    select count(*) from auto where '034' similar to '0(1|2|3)4|5(6|7)8';
    |      1000|
  23. < ESC-символ >, поставленный перед любым метасимволом, отменяет специальную интерпретацию этого метасимвола.

    select count(*) from auto where 'HARDWARE_123' similar to       '(HARD|SOFT)WARE%\_[:DIGIT:]+' escape '\';
    |       100|
  24. Если в шаблоне присутствует конструкция в квадратных скобках с использованием двоеточия, то < ESC-символом > не может быть также символ :.

    select count(*) from auto where '}}}' similar to '\}\}\}';
  25. Метасимволы имеют модификаторы (пишутся после метасимвола):

    • * – элемент регулярного выражения, непосредственно предшествующий символу '*', может появляться ноль или более раз. '*' эквивалентна {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}.

  26. Проверка совпадения выполняется столько раз, сколько возможно, не учитывая результат действия последующих метасимволов. Для управления количеством совпадений необходимо использовать символ '?'.

    Таким образом:

    • *? – 0 и более раз;

    • +? – 1 и более раз;

    • ?? – 0 или 1 раз;

    • {n}? – точно n раз;

    • {n,}? – не меньше n раз;

    • {n,m}? – больше или равно n и меньше m раз.

Общие правила
  1. Значением предиката является TRUE в том и только в том случае, когда среди всех символьных значений, генерируемых по < шаблону > регулярного выражения, найдётся символьное значение, совпадающее с < символьным выражением >.