Oracle і регулярні вирази, Інші СУБД, Бази даних, статті

Unix прийшов в Oracle у формі регулярних виразів, щоб збільшити потужність пошуку.


Я подумав, що непогано б присвятити статтю регулярними виразами, тому як ми, включаючи мене, знайомимося або освіжаємо в пам’яті міць, яку можуть дати ці вирази.


Я познайомився з регулярними виразами давним-давно, програмуючи на Perl або скриптова оболонці unix за допомогою команд awk і sed. Також, якщо Ви використовуєте vi редактор, то можете бути знайомими з регулярними виразами і порівнянням із зразком. Регулярні вирази в дійсності являють собою маленький мову програмування, який призначений для пошуку символьних зразків у текстовому рядку. Якщо чесно, коли я почав використовувати порівняння зі зразком в мої дні Perl, воно здалося мені дуже плутаним. Головним чином, тому що було настільки багато змін і варіантів, що я не знав, як почати. Хоча через деякий час, я придбав деякі навички. І Ви зможете також. Наберіться терпіння прочитати цю статтю і зрозуміти, наскільки потужним може бути це порівняння із зразком.


Як уже говорилося, регулярні вирази призначені для знаходження відповідності у символьних рядках. Інше і можливо трохи більш чітке визначення стверджує, що регулярні вирази є шаблонами, з якими порівнюються рядки символів на предмет збігу або відповідності рядка символів шаблоном. Найближчий приклад або порівняння, яке я можу дати, – це приклад, який використовує порівняння LIKE, яке пропонує деякі форми відповідності шаблоном або зразком. Наприклад, якщо ми хочемо знайти рядок символів, що містить “Deborah”, то могли б написати наступний SQL-запит.

SELECT text FROM my_text WHERE text LIKE “%Deborah%”;

Цей запит дійсно поверне всяку рядок, який містить “Deborah” в будь-якому місці тексту в межах рядка символів. Щоб зробити швидко аналогічне порівняння з допомогою регулярного вираження, можна виконати наступний SQL-запит, який містить нову функцію REGEXP_LIKE.

SELECT text FROM my_text WHERE REGEXP_LIKE (text, “Deborah”);

Отже, навіщо ми хочемо використовувати регулярні вирази замість того, щоб просто використовувати порівняння LIKE, з яким ми дуже добре знайомі? Головним чином, тому, що як тільки Ви починаєте задавати високорівневі питання про “схожості” рядки зразком, то, найбільш імовірно, закінчите умовою WHERE c багаторазовими порівняннями “OR” і “LIKE”, щоб витягнути те, що Ви дійсно шукаєте. За допомогою регулярних виразів Ви можете в більшості випадків написати тільки один зразок порівняння. Візьмемо попередній приклад. Припустимо тепер, що нам потрібно знайти в романі головний персонаж Deborah, яку також називають “Debbie”. В цьому випадку ми можемо змінити наше умова для пошуку тексту на LIKE “% Deb%”, і тим самим вирішити проблему. Але що трапиться, в цьому конкретному романі обговорюються також фінансове стан нашої дівчини з вищого суспільства. Ми можемо припинити пошук, знайшовши пропозиції, які містять слова типу “Debt”, або “Debutante”. Ми тепер маємо дуже складну проблему. Щоб гарантувати, що ми знайдемо текст, який має безпосереднє відношення до Деборі, ми повинні використовувати регулярний вираз. Ось SQL-запит, який Ви повинні виконати. Тепер він знаходить всі пропозиції, де в романі йдеться про Деборі.

SELECT text FROM my_text WHERE REGEXP_LIKE (text, “Deb(bie/orah)”);

Видно, що в межах зразка відповідності ми програмуємо варіанти тексту, що містить “Debbie” або альтернативу “Deborah”, за допомогою опції (bie / orah) у виразі. Це – канонічна форма побудови шаблону, за яким виконується порівняння рядка.


Інший складний приклад, з яким ви можете впоратися тільки використовуючи вираження, знаходить адреси електронної пошти. Це можна швидко зробити за допомогою наступного виразу. При цьому Ви будуєте частини адреси електронної пошти перед знаком “@” і після нього. Подивіться уважно на цей зразок, оскільки він вимагає трьох різних частин адреси електронної адреси і враховує присутність “.”, А так само як нижнього підкреслення “_” в імені. Всі ці символи цілком припустимі.

SELECT text FROM my_text
WHERE REGEXP_LIKE (text, “[A-Z0-9._%-]+@[A-Z0-9._%-]+.[A-Z]{2,4}”);

Тепер, якщо Ви хочете шукати тільки “. Com” адреси електронної пошти, то можна змінити SQL-код на наступний.

SELECT text FROM my_text WHERE REGEXP_LIKE (text, “[A-Z0-9._%-]+@[A-Z0-9._%-]+.com”);

Інша часто викликає труднощі проблема – це з’ясування того, чи є число в рядку тексту або перевірка того, чи представляє собою число рядок символів. Для знаходження рядка, що містить число, яке відповідає зразку з десятковою крапкою, Ви могли б використовувати цей метод. Маючи на увазі, що числа, які мають десяткову точку, повинні мати дійсне число після десяткової точки, я написав “+”, щоб вказати одне або більше чисел.

SELECT text FROM my_text WHERE REGEXP_LIKE (text, “[0-9]?.[0-9]+”);

Регулярні вирази є потужним знаряддям, коли шукаються зразки текстів чи перевіряється відповідність певним зразком, подібне телефонним номером, адресою електронної пошти, IP-адресою або майже будь зразком, який потребує перевірки. Зворотним варіантом є перевірка неприпустимих форматів і зразків символів. У нашому попередньому прикладі ми могли б легко розшукати текст, де “Debbie” написано з помилкою, наприклад, як “Debbbie” або “Debie”.


Інша часто викликає труднощі проблема – це з’ясування того, чи є число в рядку тексту або перевірка того, чи представляє собою число рядок символів. Для знаходження рядка, що містить число, яке відповідає зразку з десятковою крапкою, Ви могли б використовувати цей метод. Маючи на увазі, що числа, які мають десяткову точку, повинні мати дійсне число після десяткової точки, я написав “+”, щоб вказати одне або більше чисел.

SELECT text FROM my_text WHERE REGEXP_LIKE (text, “(Debbbie)”);

Щоб отримати імена, набрані важкими пальцями, де “b”, можливо, був набитий більш 3-х разів; ми можемо використовувати наступний запит

SELECT text FROM my_text WHERE REGEXP_LIKE (text, “(Deb)(b){2,}”);

Регулярні вирази спочатку можуть здатися дуже мудрими. Мені навіть потрібні деякі зусилля, щоб згадати ці зразки, якщо я не використав їх якийсь час. Але після деяких витрат часу на вивчення їх побудови Ви будете винагороджені, зіткнувшись зі складними критеріями пошуку.


Отже, де ж дізнатися, як будувати регулярні вирази. Це дійсно не настільки важко, як Ви могли б подумати. Регулярні вирази завжди супроводжували світу Unix, і тому є багато інформації по ним у мережі. Керівництва Oracle включають кілька сторінок, близько 5, які присвячені регулярними виразами, тому краще почати звідси, а в особливо важких випадках звертатися до мережі. Ви можете сміливо довіритися Yahoo, Google або будь-який інший вашої улюбленої пошукової машини в пошуку посібників і веб-сайтів, присвячених виключно регулярними виразами.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Трекбек і пінги

трекбеків / пінгів ще немає.

Відгуки

Дякую, навіть і не знав що в Oracle можна використовувати регулярні вирази. Допомогло в роботі.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*