Проверка вхождения подстроки по шаблону
Функция
Поиск в строке подстроки по шаблону регулярного выражения.
Спецификация
::=
::=
::=
Общие правила
-
< Символьное выражение >
в< строке >
может иметь следующие типы данных:CHAR
,VARCHAR
,NCHAR
,NCHAR VARYING
. -
< Символьный литерал >
в< шаблоне >
должен быть регулярным выражением. -
< Сопоставление >
– модификатор, изменяющий стандартный механизм сопоставления символьных данных:-
'c' – сопоставление, чувствительное к регистру символов (по умолчанию);
-
'i' – сопоставление, нечувствительное к регистру символов;
-
-
В состав
< шаблона >
могут входить метасимволы привязки, квантификаторы и операторы повтора, предопределенные символьные классы, группы выражений, метасимволы ссылок (таблица 5).
Метасимволы привязки | |
Метасимвол | Описание |
^ | Привязать выражение к началу строки: select regexp_like('Привет, как дела?', '^Привет'); [true| select regexp_like('Как дела? привет', '^Привет'); [false| |
$ | Привязать выражение к концу строки: select regexp_like('Привет, как дела?', 'Привет$'); [false| select regexp_like('Как дела? привет', 'привет$'); [true| |
ПримечаниеПривязка строки в функции REGEXP_LIKE несколько отличается от предиката сопоставления LIKE: предиката выражения 'ab' эквивалентно выражению '%ab%', выражение '^ab$' эквивалентно 'ab'. | |
Квантификаторы и операторы повтора | |
Квантификатор | Описание |
* | Встречается 0 и более раз select REGEXP_LIKE('test111', '1111*'); [false| select REGEXP_LIKE('11123345', '1111*'); [true| |
? | Встречается 0 или 1 раз select REGEXP_LIKE('test1', '1111?'); [false| select REGEXP_LIKE('11123345', '1111?'); [true| |
+ | Встречается 1 и более раз select REGEXP_LIKE('test1', '5+'); [false| select REGEXP_LIKE('11123345', '5+'); [true| |
{m} | Встречается ровно m раз select REGEXP_LIKE('test1', '3{2}'); [false| select REGEXP_LIKE('11123345', '3{2}'); [true| |
{m,} | Встречается по крайней мере m раз select REGEXP_LIKE('test1', '3{2,}'); [false| select REGEXP_LIKE('11123345','3{2,}'); [true| |
{m, n} | Встречается по крайней мере m раз, но не более n раз select REGEXP_LIKE('test1', '3{2,1}'); [false| select REGEXP_LIKE('11123345','3{2,2}'); [true| |
Предопределенные символьные классы | |
Класс | Описание |
[:alpha:] | Буквы |
[:lower:] | Буквы в нижнем регистре |
[:upper:] | Буквы в верхнем регистре |
[:digit:] | Цифры |
[:alnum:] | Буквы и цифры |
[:space:] | Пробелы |
Альтернативное сопоставление и группировка выражений | |
Метасимвол | Описание |
| | Альтернатива. Разделяет альтернативные варианты, часто используется с оператором группировки () |
( ) | Группа. Группирует подвыражения для альтернативы, квантификатора или ссылочности |
[char] | Список символов. Большинство метасимволов в списке символов представляют собой литеры, за исключением символьных классов и метасимволов ^ и - |
[^char] | Список символов, которые не должны присутствовать в строке |
Метасимвол ссылки | |
Метасимвол | Описание |
\digit | Обратная косая черта, за ней следует цифра от 1 до 9. Обратная косая черта связана с предыдущим сопоставлением с соответствующим номером заключенного в скобки подвыражения. Обратная косая черта может иметь другое значение в регулярном выражении; в зависимости от контекста она может означать также символ Escape или обратную ссылку: '\n' – ссылка на результат выражения в скобках. Например, обратная ссылка '\n': (abc|def)xy\1 соответствует строкам abcxyabc и defxydef, но не соответствует ни строке abcxydef, ни строке abcxy. Обратная ссылка позволяет осуществлять поиск строки, не зная заранее фактической строки. Например, выражение ^(.*)\1$ соответствует строке, состоящей из двух идущих подряд одинаковых строк |
Метасимволы стандарта языка Perl | |
Метасимвол | Описание |
\d | Означает любую цифру. Эквивалент [0-9]. Например, выражение для проверки ввода телефонного номера ^\(\d{3}\) \d{3}-\d{4}$ С помощью этого шаблона ищется строка, которая начинается с трехзначного числа в скобках (поэтому используем перед символом скобка знак переключения \, чтобы интерпретировать ( или ) как скобку, а не как метасимвол группы), потом пробел, за которым следует ещё раз трехзначное число, дефис и в заключении четырехзначное число. Номер (123) 456-3456 будет найден, а номер (234) 3456-3234 будет отвергнут |
\D | Означает любой символ, кроме цифр. Эквивалент [^0-9]. Например, \d\D может означать 2b или 2$, но не 22 |
\w | Означает любой алфавитно-цифровой символ, включая символ подчеркивания '_'. Эквивалент [a-zA-Z0-9_]. Например, проверка допустимого адреса электронной почты \w+@\w+(\.\w+)+ С помощью этого шаблона ищется любой алфавитно-цифровой символ повторяющийся один или более раз (т.е. просто слово), затем символ @, затем снова слово, а после этого ищется строка по шаблону, состоящему из символа (поэтому используем знак переключения \) и слова, и этот шаблон может повторятся один или несколько раз. Электронный адрес eldar52@mail.ru или eldar52@mail.org.ru будет найден, а eldar52@mail. будет отвергнут. Если известно, что допустимый адрес имеет следующий вид name@mail.domain.something, тогда изменим регулярное выражение на поиск шаблона точно 2 раза \w+@\w+(\.\w+){2}[$] {2} означает, что шаблон (\.\w+) должен встречаться именно 2 раза, а за ним должно следовать либо конец строки, либо пробел |
\W | Наоборот (от \w); эквивалент [^a-zA-Z0-9_] |
\s | Соответствует любому символу whitespace (пробелу, табуляции и пустой строке); эквивалент [ \t\n\r\f\v] |
\S | Соответствует любому не-whitespace символу; эквивалент [^ \t\n\r\f\v] |
Возвращаемое значение
Значение типа BOOLEAN: подстрока найдена (true) или не найдена (false).
Примеры
-
select regexp_like('axb', 'a.b'), regexp_like('xaybx', 'a.b'), regexp_like('abba', 'a.b'); |T|T|T|: select regexp_like('aab', '^a.b$'), regexp_like('abb', '^a.b$'), regexp_like('abb', '^a.b$'); |T|T|T|: select regexp_like('axxb', 'a.b'), regexp_like('xaybx', '^a.b$'), regexp_like('abby', '^a.b$'); |F|F|F|: select regexp_like('thing of beauty', '^thing'), regexp_like('small thing', '^thing'), regexp_like('thing of beauty', 'thing$'), regexp_like('small thing', 'thing$'); |T|F|F|T|: select regexp_like('ba', 'b(an)*a'), regexp_like('bana', 'b(an)*a'), regexp_like('banana', 'b(an)*a'), regexp_like('yourbananasplit', 'b(an)*a'); |T|T|T|T|: select regexp_like('abcef', '^ab[cd]ef$'), regexp_like('abdef', '^ab[cd]ef$'); |T|T|:а select regexp_like('ab123','[^[:digit:]]'), regexp_like('123xy','[^[:digit:]]'), regexp_like('007ab','[^[:digit:]]'), regexp_like('abcxy','[^[:digit:]]'), regexp_like('12345','[^[:digit:]]'); |T|T|T|T|F|: select regexp_like('Anderson', 'Anders(o|e|a)n'), regexp_like('Andersen', 'Anders(o|e|a)n'), regexp_like('Andersan', 'Anders(o|e|a)n'); |T|T|T|: select regexp_like('Don', 'n$'), regexp_like('Ron', 'n$'), regexp_like('Stivenson', 'n$'), regexp_like('Bone', 'n$'); |T|T|T|F|: select regexp_like('Alex', '^A'), regexp_like('Petrov Alex', '^A'); |T|F|: select regexp_like('eldar52@mail.ru', '\w+@\w+(\.\w+)+'), regexp_like('eldar52@mail.org.ru', '\w+@\w+(\.\w+)+'), regexp_like('eldar52@mail.', '\w+@\w+(\.\w+)+'); |T|T|F|: select regexp_like('name@mail.domain.something', '\w+@\w+(\.\w+){2}$'), regexp_like('name@mail.domain.something.something2', '\w+@\w+(\.\w+){2}$'), regexp_like('name@mail.domain.something.something2', '\w+@\w+(\.\w+){3}$'), regexp_like('name@mail.domain.something', '\w+@\w+(\.\w+){2}[$ ]'); |T|F|T|T|:
-
CREATE OR REPLACE TABLE contacts(l_name VARCHAR(30), p_number VARCHAR(30)); insert into contacts values ('michael','(345) 345-4567'); insert into contacts values ('michael2','345 345-4567'); select * from contacts where not REGEXP_LIKE(p_number, '^\(\d{3}\) \d{3}-\d{4}$'); select regexp_like('$$$SYSRL', '[\$\[\]\^\-]{3}'), regexp_like('ABC[$]DEF', '[\$\[\]\^\-]{3}'), regexp_like('FOO]$$D', '[\$\[\]\^\-]{3}'), regexp_like('FOO-^-D', '[\$\[\]\^\-]{3}'), regexp_like('[$$]', '^[\$\[\]\^\-]{3}$'); |T|T|T|T|F|: select regexp_like('abefff', 'aB(cD)*eF+', 'i'), regexp_like('ABCDEF', 'aB(cD)*eF+', 'i'), regexp_like('ABCDE', 'aB(cD)*eF+', 'i'); |T|T|F|:
-
create or replace table regtest(name varchar(30), birthdate varchar(10), city varchar(20)); insert into regtest values('Иванов','01011982','Воронеж'); insert into regtest values('Зайцев','01111998','Киев'); insert into regtest values('Петров','01011988','Москва'); -- выборка из таблицы записей, которые содержат дату рождения в заданном формате REGEXP [0-9]{8} select * from regtest where regexp_like(birthdate,'[0-9]{8}'); -- результат: --Зайцев,01111998,Киев --Иванов,01011982,Воронеж --Петров,01011988,Москва -- добавление записи с нестандартным форматом даты insert into regtest values('Волков','010A1988','Дмитров'); select * from regtest where regexp_like(birthdate,'[0-9]{8}'); --результат --Зайцев,01111998,Киев --Иванов,01011982,Воронеж --Петров,01011988,Москва select regexp_like('_', '^\w$'); |T|: select regexp_like('2b', '\d\D'), regexp_like('2$', '\d\D'), regexp_like('22', '\d\D'); |T|T|F|: select regexp_like('bce','(a|b)c(d|e)'); |T|: select regexp_like('xayfa','x(a|b(c|d))y(e|f)\1'), regexp_like('xayff','x(a|b(c|d))y(e|f)\2'), regexp_like('xayfe','x(a|b(c|d))y(e|f)\2'); |T|T|F|: select regexp_like('abcxyabc','(abc|def)xy\1'), regexp_like('defxydef','(abc|def)xy\1'), regexp_like('abcxydef','(abc|def)xy\1'), regexp_like('abcxy','(abc|def)xy\1'); |T|T|F|F|: select regexp_like('forfor','(.*)\1'), regexp_like('forfot','(.*)\1'); |T|F|:
-
create or replace table tab25574_phone_2 (id int, fio char(40), mobile_phone char(15)); insert into tab25574_phone_2 values (101, 'Hhh F.G.', '+7-900-900-9090'); insert into tab25574_phone_2 values (102, 'Aaa B.C.', '8-700-700-7070'); insert into tab25574_phone_2 values (102, 'Xx Y.Y.', '8-500-500-5050'); !Выбираются по 3 записи для нижеследующих 6 запросов select * from tab25574_phone_2 where REGEXP_LIKE(fio, '[A-Z]{1}[a-z]{1,} ([A-Z]\.){2}'); select * from tab25574_phone_2 where REGEXP_LIKE(fio, '([A-Z]\.){2}'); select * from tab25574_phone_2 where REGEXP_LIKE(fio, '[A-Z]{1}[a-z]{1,}'); select * from tab25574_phone_2 where REGEXP_LIKE(fio, '([A-Z]){1}([a-z]){1,}'); select * from tab25574_phone_2 where REGEXP_LIKE(fio, '([[:upper:]]){1}([[:lower:]]){1,} ([[:upper:]]\.){2}'); select * from tab25574_phone_2 where REGEXP_LIKE(fio, '[[:upper:]]{1}([[:lower:]]){1,} ([[:upper:]]\.){2}');