В Oracle, REGEXP_REPLACE()
функцията заменя появата на подниз в низ, който съответства на дадения модел на регулярен израз.
Той разширява функционалността на REPLACE()
функция, като ни позволява да използваме модели на регулярни изрази.
Синтаксис
Синтаксисът е така:
REGEXP_REPLACE ( source_char, pattern
[, replace_string
[, position
[, occurrence
[, match_param ]
]
]
]
)
Къде:
source_char
е символен израз, който служи като стойност за търсене.pattern
е регулярният израз.replace_string
е заместващият низ.position
е положително цяло число, което указва къде да започне търсенето. По подразбиране е1
, което означава, започнете търсенето от първия знак.occurrence
е неотрицателно цяло число, което указва кое събитие да се замени. По подразбиране е0
, което означава заместване на всички събития.match_param
ви позволява да промените поведението на съвпадение по подразбиране на функцията. Например, той ви позволява да зададете чувствителност към малки и големи букви, как се обработват множество редове и интервали и т.н. Този аргумент работи по същия начин, както когато се използва сREGEXP_COUNT()
функция. Вижте документацията на Oracle за повече информация.
Пример
Ето един основен пример за използване на REGEXP_REPLACE()
в Oracle:
SELECT
REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird')
FROM DUAL;
Резултат:
Cats and birds
В този случай има съвпадение и поднизът се заменя със заместващия низ.
Регулярните изрази могат да бъдат много мощни и този пример използва много прост пример. За да използвате REGEXP_REPLACE()
ефективно, ще трябва да знаете правилния модел, който да използвате за желания резултат.
Няма съвпадение
Ето пример, където няма съвпадение:
SELECT REGEXP_REPLACE('Cats and dogs', 't.g', 'bird');
Резултат:
+------------------------------------------------+ | REGEXP_REPLACE('Cats and dogs', 't.g', 'bird') | +------------------------------------------------+ | Cats and dogs | +------------------------------------------------+
Няма съвпадение, така че оригиналният низ се връща непроменен.
Множество съвпадения
Ето пример с множество съвпадения:
SELECT
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird')
FROM DUAL;
Резултат:
My bird likes other birds
Можете обаче да посочите кое събитие да замените, ако е необходимо:
SELECT
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 1, 2)
FROM DUAL;
Резултат:
My dog likes other birds
Имайте предвид, че добавих два аргумента тук – 1
и 2
. 1
определя местонахождението в низа, за да започне търсенето (в този случай на първия знак). 2
е това, което определя кое събитие да се замени. В този случай второто появяване се заменя.
Ето какво се случва, ако започна търсенето след първото срещане:
SELECT
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 2)
FROM DUAL;
Резултат:
My dog likes other dogs
В този случай низът не се актуализира, защото има само още едно събитие след началната позиция.
Ако променя последния аргумент на 1
, след което се актуализира, както е посочено (тъй като това е първото появяване след посочената начална позиция):
SELECT
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 1)
FROM DUAL;
Резултат:
My dog likes other birds
И в случай, че се чудите, 0
посочва всички събития:
SELECT REGEXP_REPLACE(
'My dog likes big dogs and small dogs',
'd.g',
'bird', 1, 0
)
FROM DUAL;
Резултат:
My bird likes big birds and small birds
Но все пак уважава всяка посочена начална позиция:
SELECT REGEXP_REPLACE(
'My dog likes big dogs and small dogs',
'd.g',
'bird', 7, 0
)
FROM DUAL;
Резултат:
My dog likes big birds and small birds
Чувствителност на регистрите
REGEXP_REPLACE()
функцията следва правилата за определяне и извеждане на съпоставяне на Oracle, които дефинират съпоставянето, което да се използва при съпоставяне на низа с шаблона.
Въпреки това, можете изрично да посочите чувствителност към малки и малки букви с незадължителния шести аргумент. Когато направите това, той отменя всяка чувствителност към малки и големи букви или чувствителност към акцента на определеното съпоставяне.
Можете да посочите i
за съвпадение без значение на главни и c
за съвпадение, чувствително към главни букви.
Ето един пример:
SELECT
REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0) AS "Default",
REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0, 'i') AS "Case Insensitive",
REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0, 'c') AS "Case Sensitive"
FROM DUAL;
Резултат:
Default Case Insensitive Case Sensitive __________ ___________________ _________________ My Cats My dogs My Cats
От тези резултати изглежда, че съпоставянето ми по подразбиране е чувствително към малки и големи букви. Другите два низа бяха принудени към съвпадение, независимо от главни и малки букви, съответно.
Нулеви аргументи
Предаването на null
води до null
за повечето аргументи, с изключение на втория и шестия аргумент:
SET NULL 'null';
SELECT
REGEXP_REPLACE(null, 'c.t', 'dog', 1, 0, 'i') AS "1",
REGEXP_REPLACE('Cat', null, 'dog', 1, 0, 'i') AS "2",
REGEXP_REPLACE('Cat', 'c.t', null, 1, 0, 'i') AS "3",
REGEXP_REPLACE('Cat', 'c.t', 'dog', null, 0, 'i') AS "4",
REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, null, 'i') AS "5",
REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, null) AS "6"
FROM DUAL;
Резултат:
1 2 3 4 5 6 _______ ______ _______ _______ _______ ______ null Cat null null null Cat
По подразбиране SQLcl и SQL*Plus връщат празно пространство всеки път, когато null
възниква в резултат на SQL SELECT
изявление.
Можете обаче да използвате SET NULL
за да посочите различен низ, който да бъде върнат. Тук посочих, че низът null
трябва да бъдат върнати.
Грешен брой аргументи
Предаването на никакви аргументи на функцията или твърде малко води до грешка:
SELECT REGEXP_REPLACE()
FROM DUAL;
Резултат:
Error starting at line : 1 in command - SELECT REGEXP_REPLACE() FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action:
Същото е и с предаването на твърде много аргументи:
SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', 'oops')
FROM DUAL;
Резултат:
Error starting at line : 1 in command - SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', 'oops') FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function" *Cause: *Action:
Повече информация
REGEXP_REPLACE()
функцията (както и другата реализация на регулярни изрази на Oracle) съответства на стандарта за регулярни изрази на интерфейса на IEEE Portable Operating System Interface (POSIX) и на Указанията за регулярни изрази на Unicode на Unicode Consortium.
Вижте документацията на Oracle за повече информация и примери за REGEXP_REPLACE()
функция.