Строковые операторы
Регулярные выражения часто применяются для поиска подстрок в строках-литералах большего размера. При поиске соответствия с учетом регистра символов используется оператор -; с оператором -* регистр игнорируется. Примеры приведены в листинге 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. При выполнении любого (благодаря символу |) из этих условий соответствие считается найденным.