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