Регулярни изрази, които подобряват SQL операторите - Софтуерни продукти

Регулярните изрази в Oracle Database 10g са мощен инструмент за манипулиране на текстови данни.

Нова функция в Oracle Database 10g значително подобрява способността за търсене и манипулиране на данни със знаци. Тази функция, регулярни изрази, е транскрипция за описание на извадка от текст. Той отдавна е достъпен в много езици за програмиране и много помощни програми за UNIX.

Какво е регулярен израз?

Регулярният израз съдържа един или повече знаци и/или метазнаци. В най-простата си форма регулярният израз може да се състои само от знаци, като регулярния израз cat. Чете се като c, последвано от a и t, и този модел съвпада с низове като котка, местоположение и каталог. Метасимволите предоставят алгоритми за това как Oracle обработва знаците, които съставят регулярен израз. Когато значението на различните метасимволи е ясно, ще видите колко полезни са регулярните изрази за подчертаване и заместване на всякакви текстови данни.

Използване на регулярни изрази в Oracle Database 10g

За да се възползвате от силата на регулярните изрази, можете да използвате функциите REGEXP_INSTR, REGEXP_SUBSTR и REGEXP_REPLACE и новия SQL оператор на Oracle REGEXP_LIKE. Ще видите как тази нова функционалност поддържа съществуващия оператор LIKE и функциите INSTR, SUBSTR и REPLACE. Те наистина са подобни на съществуващия оператор и функции, но сега предоставят мощни възможности за съпоставяне на шаблони. Данните, които търсите, могат да бъдат обикновен низ или голям текст, съхранени в колона със знаци в базата данни. Регулярните изрази ви позволяват да търсите, замествате и проверявате данни по начин, койтоникога не сте мечтали, с висока степен на гъвкавост.

Примери за регулярен израз

Преди да използвате новата функционалност, трябва да разберете значението на някои метасимволи. Точка (.) в регулярен израз съответства на всеки знак (с изключение на нов ред). Например регулярният израз a.b съвпада с низ, съдържащ буквата a, последвана от произволен единичен знак (с изключение на нов ред), последван от буквата b. Низовете axb, xaybx и abba са подходящи, защото съдържат този модел. Ако искате точно съвпадение на низ от три знака, където низът започва с a и завършва с b, регулярният израз трябва да бъде окован. Метасимволът за вмъкване (^) обозначава началото на ред, а доларът ($) обозначава края на ред (вижте таблица 1). Следователно регулярният израз ^a.b$ съвпада с низовете aab, abb или axb. За да сравните този метод с познатото съпоставяне на шаблон на оператор LIKE, можете да използвате шаблон като a_b, където долната черта (_) е всеки отделен знак.

По подразбиране единичен знак или списък от знаци в регулярен израз се намира веднъж. За намиране на множество срещания на символ на регулярен израз се използва квантификатор, известен също като оператор за повторение. Ако искате да съпоставите низ, който започва с буквата a и завършва с буквата b, регулярният израз изглежда така: ^a.*b$. Метасимволът * повтаря предишното съвпадение на всеки метасимвол (.) нула, един или повече пъти. Еквивалентният шаблон за оператора LIKE е a%b, където (%) означава нула, едно или повече срещания на произволен знак.

Таблица 2 показва пълния списък на операторите за повторение. Имайте предвид, че съдържа специфични опции за повторение, които позволяват повече гъвкавост отсъществуващи заместващи символи на оператор LIKE. Ако изразът е ограден в скоби, което води до подизраз, тогава подизразът може да се повтори определен брой пъти. Например регулярният израз b(an)*a съвпада с ba, bana, banana, yourbananasplit и т.н.

Регулярните изрази на Oracle поддържат POSIX (Интерфейс на преносима операционна система) символни класове, които са изброени в Таблица 3. Това означава, че можете да търсите много специфични типове знаци. Представете си да напишете условие LIKE, което търси само небуквени знаци - получената клауза WHERE лесно става много сложна.

POSIX символен клас трябва да бъде в списък със знаци, означен с квадратни скоби ([]). Например регулярният израз [[:lower:]] съвпада с един знак с малка буква, а [[:lower:]] съвпада с пет последователни знака с малка буква.

В допълнение към POSIX символните класове, единични знаци могат да бъдат включени в списъка със знаци. Например регулярният израз ^ab[cd]ef$ съответства на низовете abcef и abdef. И двете c и d са съвпадащи.

Повечето метасимволи в списъка се третират като букви, с изключение на каретката (^) и тирето (-). Регулярните изрази могат да изглеждат сложни, защото едни и същи метазнаци имат множество значения в зависимост от контекста. ^ е само един от тези метазнаци. Ако това е първият знак в списъка със знаци, това означава, че не е в списъка. Следователно [^[:digit:]] съвпада само с нецифрени знаци, докато ^[[:digit:]] търси съвпадение, което започва с цифра. Тире (-) означава диапазон; регулярният израз [a-m] съвпада с всяка буква от a до m. Това обаче е знак за тире, ако е в началото на списъка със знаци,например [-afg].

Един от предишните примери показа използването на скоби за създаване на подизраз; те ви позволяват да въвеждате алтернативи, разделени от вертикалната лента (/), алтернативния метасимвол.

Например регулярният израз t(a/e/i)n позволява три възможни алтернативни знака между буквите t и n. Този модел съответства на тен, десет, калай и Пакистан, но не и на тийнейджър, планина или мелодия. От друга страна, регулярният израз t(a/e/i)n може да бъде описан като списък от знаци, като t[aei]n. Тези метасимволи са групирани в таблица 4. Въпреки че има много повече метасимволи, този кратък списък е важен за разбирането на регулярните изрази, използвани в тази статия.

Когато операторът REGEXP_LIKE се срещне в база данни на Oracle, той въвежда регулярни изрази. Таблица 5 показва синтаксиса REGEXP_LIKE.

Следната SQL заявка WHERE демонстрира оператора REGEXP_LIKE, който търси ZIP колона със стойности, които съответстват на регулярния израз [^[:digit:]]. Ще бъдат избрани онези редове от таблицата ZIPCODE, в които стойността на колоната ZIP съдържа символ, който не е цифра.

Този пример за регулярен израз се състои само от метасимволи, по-специално цифрата от POSIX символния клас, разделена с двоеточие и квадратни скоби. Вторият набор от скоби (както в [^[:digit:]]) ограничава списъка с класове знаци. Както е обяснено по-горе, това е необходимо, тъй като POSIX символните класове могат да се използват само за формиране на списък със знаци.

Тази функция връща началната позиция на шаблона, така че работи много като вече познатата функция INSTR. Синтаксисът на новата функция REGEXP_INSTR е показан в таблица 6. Основната разлика между двете функции е, че REGEXP_INSTRви позволява да посочите шаблон вместо конкретен низ за търсене; като по този начин се осигурява по-голямо разнообразие. Следващият пример използва функцията REGEXP_INSTR, която връща началната позиция на петцифрения пощенски код в низа Joe Smith, 10045 Berry Lane, San Joseph, CA 91234. Ако регулярният израз е [[:digit:]], тогава началната позиция на номера на къщата ще бъде върната вместо пощенския код, тъй като 10045 е първото появяване на пет последователни цифри. Следователно изразът трябва да бъде прикрепен към края на низа с метазнака $, тогава функцията ще покаже началната позиция на пощенския код вместо набор от цифри, съответстващи на номера на къщата.

По-сложни шаблони

Нека усложним шаблона за пощенски код от предишния пример, за да намерим допълнителните четири цифри. Сега може да изглежда така: [[:digit:]](-[[:digit:]])?$. Ако изходният низ завършва с 5-цифрен пощенски код или 5-цифрен + 4 пощенски код, тогава ще трябва да се покаже началната позиция на шаблона.

В този пример подизраз (-[[:digit:]]) е ограден в скоби, който може да се повтори нула или повече пъти, какво показва операторът за повторение? От друга страна, ако се опитате да използвате традиционни SQL функции, за да получите същия резултат, формулировката ще бъде трудна дори за SQL експерт. За по-добро обяснение на различните компоненти на този пример за регулярен израз, таблица 7 предоставя описание на отделните знаци и метазнаци.

Функцията REGEXP_SUBSTR е много подобна на функцията SUBSTR и връща част от низ. Таблица 8 показва синтаксиса на новата функция. Следващият пример връща низ, който съответства на модела [^,]*. Регулярният израз търси запетая, последвана от интервал; след това нула или повече знаци без запетая, което показва [^,]*; и след това търси друга запетая. пробаще изглежда нещо като низ от стойности, разделени със запетая.

Нека първо да разгледаме традиционната функция SQL REPLACE, която замества един низ с друг. Да предположим, че има допълнителни интервали в текста и бихте искали да ги замените с един интервал. Във функцията REPLACE трябва да посочите точно толкова интервали, колкото трябва да замените. Допълнителните пространства обаче могат да бъдат разположени на повече от едно място. Следващият пример има три интервала между Джо и Смит. Функционалният параметър REPLACE показва, че два интервала трябва да бъдат заменени с един интервал. В този случай резултатът има един допълнителен интервал по-малко, докато между Джо и Смит имаше три интервала в оригиналния низ.

Функцията REGEXP_REPLACE извършва замествания с порядък по-нататък; това е описано в таблица 9. Следната заявка замества всеки два или повече интервала с един интервал. Подизразът ( ) съдържа един интервал, който може да се повтори два или повече пъти, което показва .

Полезна функция на регулярните изрази е способността да се помни подизраз за по-късна употреба; нарича се също възможност за свързване (описано в таблица 10). Тя ви позволява да извършвате сложни замествания, като например преместване на шаблон на нова позиция или намиране на повтаряща се дума или буква. Частта, съответстваща на подизраза, се съхранява във временен буфер. Буферите са номерирани отляво надясно и достъпът до тях е чрез \digit, където digit е число от 1 до 9, което съответства на поредния номер на подизраза, обозначен със скоби.

Следващият пример показва как името Ellen Hildi Smith се преобразува в Smith, Ellen Hildi чрез позоваване на отделни подизрази по номер.

Този SQL израз има три отделни подизраза, оградени в скоби. Всеки индивидподизразът съдържа метасимвола за съвпадение на всеки знак (.), последван от метасимвола *, указващ, че всеки знак (с изключение на нов ред) трябва да се появи нула или повече пъти. Всеки подизраз е разделен с интервал, който също трябва да бъде съпоставен. Скобите обозначават подизрази за прихващане на стойности, които могат да бъдат посочени чрез \номер. Първият подизраз е свързан с \1, вторият с \2 и т.н. Тези препратки се използват в последния параметър на тази функция (\3, \1 \2), която връща модифицирания подниз, като го преобразува в необходимия формат (включително запетаи и интервали). Таблица 11 описва отделните елементи на този регулярен израз.

Препратките са полезни за замяна, форматиране и намиране на поднизове и могат да се използват за намиране на съседни стойности. Следващият пример показва използването на функцията REGEXP_SUBSTR за намиране на дублирани знаци/числови стойности, разделени с интервал. Полученият резултат показва думите, които се дублират.

Допълнителна опция за картографиране

Може би сте забелязали, че операторът и функциите на регулярния израз може да съдържат допълнителен съвпадащ параметър. Тази настройка контролира чувствителността към главни и малки букви, новоредови и многоредови повторения.

Практически приложения на регулярните изрази

Регулярните изрази се използват не само в заявки, но и на всяко място, където са разрешени SQL изрази и функции, като например в PL/SQL. Можете да пишете тригери, където регулярните изрази са полезни за валидиране, генериране или извличане на стойности.

Знаците преди или след не са разрешени, както е показано от ^ и $. Трябва да се уверите, че регулярният израз не е разделен на няколко реда и не е такасъдържа допълнителни интервали, освен ако не е необходимо да бъде част от шаблона и следователно да съответства. Таблица 12 обяснява отделните елементи на този пример за регулярен израз.

Вижте страницата на Oracle Database 10g:

Сравнение на регулярен израз със съществуваща функционалност

Регулярните изрази имат някои предимства пред обикновения оператор LIKE и функциите INSTR, SUBSTR и REPLACE. Тези традиционни SQL функции нямат възможност за съвпадение на шаблони. Само операторът LIKE може да извършва съпоставяне на знаци с помощта на знаците за групиране % и _, но LIKE не поддържа повторения на изрази, сложно редуване, диапазони от знаци, списъци със знаци, класове знаци на POSIX и т. н. А новите функции с регулярни изрази могат също да намират дубликати и да извършват пермутация. Примерите, показани в тази статия, предоставят бърз поглед към света на регулярните изрази и как да ги използвате в приложения.

Полезно допълнение към инструментариума

Регулярните изрази са много полезни, тъй като помагат за решаването на сложни проблеми. Някои характеристики на регулярните изрази са трудни за възпроизвеждане с помощта на традиционни SQL функции. Когато се научи създаването на основните конструкции на този донякъде сложен език, регулярните изрази ще станат необходима част от инструмента в контекста не само на SQL, но и на други езици за програмиране. Докато тестването и правенето на грешки понякога е необходимо за развиване на индивидуални умения за писане на шаблони, елегантността и силата на регулярните изрази са неоспорими.