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

Функция

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

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

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

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

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

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

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

      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. , поставленный перед любым метасимволом, отменяет специальную интерпретацию этого метасимвола.

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

    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 в том и только в том случае, когда среди всех символьных значений, генерируемых по <шаблону> регулярного выражения, найдётся символьное значение, совпадающее с <символьным выражением>.