Иллюстрированный самоучитель по PostgreSQL

Строковые операторы

Регулярные выражения часто применяются для поиска подстрок в строках-литералах большего размера. При поиске соответствия с учетом регистра символов используется оператор -; с оператором -* регистр игнорируется. Примеры приведены в листинге 5.6.

Листинг 5.6. Простой поиск соответствия.

booktown=# SELECT title FROM books
booktown-# WHERE title – 'The';
title
The Shining The Cat in the Hat The Velveteen Rabbit
The Tell-Tale Heart
(4 rows)

booktown=# SELECT title FROM books
booktown-f WHERE title – * 'The'; title
The Shining The Cat in the Hat Bartholomew and
the Oobleck Franklin in the Dark The Velveteen Rabbit
The Tell-Tale Heart
(6 rows)

Как видно из результатов, оператор ~* возвращает две дополнительные записи, поскольку выражение соответствует не только подстроке "the", но и любым модификациям в регистре символов этой подстроки (the, tHe, ThE и т. д.).

Если добавить в начало этого регулярного выражения символ л, оно будет соответствовать только подстроке "The", находящейся в начале исходного текста (листинг 5.7).

Конструкция .* обозначает любое количество произвольных символов до следующего подвыражения. В данном примере этим подвыражением является пара строк в круглых скобках (rabbit и heart), разделенных символом |, что соответствует любой из перечисленных строк.

Листинг 5.7. Нетривиальный поиск соответствия.

booktown=f SELECT title FROM books
booktown-# WHERE title – * IAThe.*(rabbit|heart)';
title
The Velveteen Rabbit The Tell-Tale Heart
(2 rows)

Выражение AThe.*(rabbit|heart) означает следующее: соответствие находится лишь в том случае, если строка начинается с символов "The", далее идет любое количество произвольных символов, а после них следует либо подстрока "rabbit", либо подстрока "heart". Оператор ~* (вместо оператора ~) производит сравнение без учета регистра символов.

В листинге 5.8 приведен пример еще более сложного регулярного выражения.

Листинг 5.8. Сложный поиск соответствия.

booktown=# SELECT title FROM books
booktown-# WHERE title ~* 'rt.*[ri]t) | (ingJjune$)':
title
The Shining Dune
The Velveteen Rabbit The Tell-Tale Heart
(4 rows)
booktown=#

На первый взгляд регулярное выражение в листинге 5.8 выглядит устрашающе. Но если разбить его на элементы, становится видно, что оно состоит из двух выражений в круглых скобках, разделенных символом |.Таким образом, соответствие будет найдено, если хотя бы одно из этих выражений указывает на значение в поле title.

Продолжая анализ выражения, мы видим, что подвыражение слева от символа | состоит из следующих элементов (слева направо): метасимвол л, за которым следует символ t, затем последовательность.* и пара квадратных скобок с символами г и i, за которыми следует символ t. В переводе на русский язык это означает, что соответствие должно начинаться с буквы t, за которой следует ноль или более символов, пока не будет встречена буква г или 1, после которой немедленно следует буква t. Если хотя бы одно из этих условий не соблюдается, соответствия нет.

Выражение в правой части устроено проще. Оно состоит из двух литералов ing и une, разделенных очередным символом, причем за каждым литералом следует символ $. В переводе это означает, что совпадение должно заканчиваться подстрокой Ing или une. При выполнении любого (благодаря символу |) из этих условий соответствие считается найденным.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.