В Oracle, REGEXP_SUBSTR()
функцията връща подниз от низ въз основа на модел на регулярен израз.
Той разширява функционалността на SUBSTR()
функция, като ни позволява да използваме модели на регулярни изрази.
Синтаксис
Синтаксисът е така:
REGEXP_SUBSTR ( source_char, pattern
[, position
[, occurrence
[, match_param
[, subexpr ]
]
]
]
)
Къде:
source_char
е символен израз, който служи като стойност за търсене.pattern
е регулярният израз.position
е положително цяло число, което указва къде да започне търсенето. По подразбиране е1
, което означава, започнете търсенето от първия знак.occurrence
е неотрицателно цяло число, което указва кое събитие да се търси. По подразбиране е1
, което означава търсене за първото срещане.match_param
ви позволява да промените поведението на съвпадение по подразбиране на функцията. Например, той ви позволява да зададете чувствителност към малки и големи букви, как се обработват множество редове и интервали и т.н. Този аргумент работи по същия начин, както когато се използва сREGEXP_COUNT()
функция. Вижте документацията на Oracle за тази функция за повече информация.- За
pattern
с подизрази,subexpr
е неотрицателно цяло число от 0 до 9, което показва кой подизраз вpattern
трябва да бъде върната от функцията. Този аргумент работи по същия начин, както когато се използва сREGEXP_INSTR()
функция. Вижте документацията на Oracle за повече информация за тази функция.
Пример
Ето един основен пример за използване на REGEXP_SUBSTR()
в Oracle:
SELECT
REGEXP_SUBSTR('Cats and dogs', 'd.g')
FROM DUAL;
Резултат:
dog
В този случай има съвпадение и се връща първият (и в този случай единствен) съответстващ подниз.
Регулярните изрази могат да бъдат много мощни и този пример използва много прост пример. За да използвате REGEXP_SUBSTR()
ефективно, ще трябва да знаете правилния модел, който да използвате за желания резултат.
Няма съвпадение
Ето пример, където няма съвпадение:
SET NULL 'null';
SELECT REGEXP_SUBSTR('My dogs like dregs', 't.g')
FROM DUAL;
Резултат:
null
Няма съвпадение, така че null
се връща.
По подразбиране SQLcl и SQL*Plus връщат празно пространство всеки път, когато null
възниква в резултат на SQL SELECT
изявление.
Можете обаче да използвате SET NULL
за да посочите различен низ, който да бъде върнат. Тук посочих, че низът null
трябва да бъдат върнати.
Множество съвпадения
Ето пример с множество съвпадения:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g')
FROM DUAL;
Резултат:
dog
Можете обаче да посочите кое събитие да замените, ако е необходимо:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;
Резултат:
dag
Имайте предвид, че добавих два аргумента тук; 1
и 2
. 1
определя местонахождението в низа, за да започне търсенето (в този случай на първия знак). 2
е това, което определя кое събитие да се търси. В този случай се търси второто появяване.
Ето какво се случва, ако започна търсенето след първото срещане:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;
Резултат:
null
В този случай няма съвпадение, защото има само още едно събитие след началната позиция.
Ако променя последния аргумент на 1
, тогава получаваме съвпадение (тъй като това е първото срещане след посочената начална позиция):
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;
Резултат:
dag
Чувствителност на регистрите
REGEXP_SUBSTR()
функцията следва правилата за определяне и извеждане на съпоставяне на Oracle, които дефинират съпоставянето, което да се използва при съпоставяне на низа с шаблона.
Въпреки това, можете изрично да посочите чувствителност към малки и големи букви с незадължителния пети аргумент. Когато направите това, той отменя всяка чувствителност към малки и малки букви или чувствителност към акцент на определеното съпоставяне.
Можете да посочите i
за съвпадение без значение на главни и c
за съвпадение, чувствително към главни букви.
Ето един пример:
SELECT
REGEXP_SUBSTR('My Cats', 'c.t', 1, 1) AS "Default",
REGEXP_SUBSTR('My Cats', 'c.t', 1, 1, 'i') AS "Case Insensitive",
REGEXP_SUBSTR('My Cats', 'c.t', 1, 1, 'c') AS "Case Sensitive"
FROM DUAL;
Резултат:
Default Case Insensitive Case Sensitive __________ ___________________ _________________ null Cat null
Моето съпоставяне изглежда е чувствително към малки и големи букви въз основа на тези резултати. Другите два низа бяха принудени към съвпадение, независимо от главните и главни букви, съответно.
Подизрази
Ето пример за използване на шестия аргумент за връщане на конкретен модел на подизрази:
SELECT REGEXP_SUBSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 'i', 1
)
FROM DUAL;
Резултат:
cat
В този случай върнах първия подизраз.
Ето какво се случва, ако посоча третия подизраз:
SELECT REGEXP_SUBSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 'i', 3
)
FROM DUAL;
Резултат:
cow
Нулеви аргументи
Ако някой аргумент е null
, резултатът е null
:
SET NULL 'null';
SELECT
REGEXP_SUBSTR(null, 'c.t', 1, 1, 'i', 1) AS "1",
REGEXP_SUBSTR('Cat', null, 1, 1, 'i', 1) AS "2",
REGEXP_SUBSTR('Cat', 'c.t', null, 1, 'i', 1) AS "3",
REGEXP_SUBSTR('Cat', 'c.t', 1, null, 'i', 1) AS "4",
REGEXP_SUBSTR('Cat', 'c.t', 1, 1, null, 1) AS "5",
REGEXP_SUBSTR('Cat', 'c.t', 1, 1, 'i', null) AS "6"
FROM DUAL;
Резултат:
1 2 3 4 5 6 _______ _______ _______ _______ _______ _______ null null null null null null
Грешен брой аргументи
Предаването на никакви аргументи на функцията или твърде малко води до грешка:
SELECT REGEXP_SUBSTR()
FROM DUAL;
Резултат:
Error starting at line : 1 in command - SELECT REGEXP_SUBSTR() 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_SUBSTR('Cat', 'c.t', 1, 1, 'i', 1, 'oops')
FROM DUAL;
Резултат:
Error starting at line : 1 in command - SELECT REGEXP_SUBSTR('Cat', 'c.t', 1, 1, 'i', 1, '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_SUBSTR()
функцията (както и другата реализация на регулярни изрази на Oracle) съответства на стандарта за регулярни изрази на интерфейса на IEEE Portable Operating System Interface (POSIX) и на Указанията за регулярни изрази на Unicode на Unicode Consortium.
Вижте документацията на Oracle за повече информация и примери за REGEXP_SUBSTR()
функция.