V Oracle, REGEXP_INSTR()
funkce hledá v řetězci vzor regulárního výrazu. Vrací celé číslo označující počáteční nebo koncovou pozici shodného podřetězce (podle toho, který zadáte).
Rozšiřuje funkčnost INSTR()
tím, že nám umožňuje používat vzory regulárních výrazů.
Syntaxe
Syntaxe vypadá takto:
REGEXP_INSTR ( source_char, pattern
[, position
[, occurrence
[, return_opt
[, match_param
[, subexpr ]
]
]
]
]
)
Kde:
source_char
je znakový výraz, který slouží jako hledaná hodnota.pattern
je regulární výraz.position
je kladné celé číslo, které určuje, kde začít hledání. Výchozí hodnota je1
, což znamená, že začněte hledat od prvního znaku.occurrence
je kladné celé číslo, které určuje, který výskyt se má hledat. Výchozí hodnota je1
, což znamená, že vyhledá první výskyt.return_opt
určuje, zda má Oracle vrátit počáteční nebo koncovou pozici shodného podřetězce. Použijte0
pro začátek a1
pro zakončení. Výchozí hodnota je0
.match_param
umožňuje změnit výchozí chování funkce při přiřazování. Umožňuje vám například určit rozlišování malých a velkých písmen, jak se pracuje s více řádky a mezerami atd. Tento argument funguje stejně jako při použití s REGEXP_COUNT()
funkce. Další informace naleznete v dokumentaci Oracle pro tuto funkci.- Pro
pattern
s podvýrazy,subexpr
je nezáporné celé číslo od 0 do 9 udávající, který podvýraz vpattern
má být vráceno funkcí. Tento argument funguje stejně jako při použití s REGEXP_INSTR()
funkce. Další informace o této funkci naleznete v dokumentaci společnosti Oracle.
Příklad
Zde je základní příklad použití REGEXP_INSTR()
v Oracle:
SELECT
REGEXP_INSTR('My dogs are fluffy', 'd.g')
FROM DUAL;
Výsledek:
4
V tomto případě dojde ke shodě a vrátí se počáteční pozice podřetězce.
Regulární výrazy mohou být velmi výkonné a tento příklad používá velmi jednoduchý příklad. Chcete-li použít REGEXP_INSTR()
efektivně, budete potřebovat znát správný vzor, který použijete pro požadovaný výsledek.
Žádná shoda
Zde je příklad, kdy neexistuje žádná shoda:
SELECT REGEXP_INSTR('My dogs like dregs', 't.g')
FROM DUAL;
Výsledek:
0
Žádná shoda, takže 0
je vráceno.
Více shod
Zde je příklad s více shodami:
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g')
FROM DUAL;
Výsledek:
4
Vrátil pozici prvního výskytu.
Můžete však určit, který výskyt se má nahradit:
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;
Výsledek:
14
Všimněte si, že jsem zde přidal dva argumenty; 1
a 2
. 1
určuje místo pobytu v řetězci pro zahájení vyhledávání (v tomto případě u prvního znaku). 2
je to, co určuje, který výskyt se má hledat. V tomto případě se hledá druhý výskyt.
Co se stane, když zahájím vyhledávání po prvním výskytu:
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;
Výsledek:
0
V tomto případě se nejedná o žádnou shodu, protože po startovní pozici je pouze jeden další výskyt.
Pokud změním poslední argument na 1
, pak dostaneme shodu (protože je to první výskyt po zadané počáteční pozici):
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;
Výsledek:
14
Vraťte koncovou polohu
Můžete předat pátý argument buď 0
nebo 1
určit, zda má funkce vrátit počáteční nebo koncovou pozici podřetězce.
Výchozí hodnota je 0
(pro výchozí pozici). Co se stane, když zadáme 1
:
SELECT
REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1)
FROM DUAL;
Výsledek:
7
Jen pro upřesnění, tady je to znovu ve srovnání s 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;
Výsledek:
Start End ________ ______ 4 7
Rozlišovat malá a velká písmena
REGEXP_INSTR()
funkce se řídí pravidly Oracle pro určení a odvození řazení, která definují řazení, které se má použít při porovnávání řetězce se vzorem.
Pomocí volitelného šestého argumentu však můžete explicitně určit rozlišování malých a velkých písmen. Když to uděláte, přepíše to rozlišování malých a velkých písmen nebo zvýraznění v určeném řazení.
Můžete zadat i
pro párování bez rozlišení velkých a malých písmen a c
pro rozpoznávání velkých a malých písmen.
Zde je příklad:
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;
Výsledek:
Default Case Insensitive Case Sensitive __________ ___________________ _________________ 0 4 0
Na základě těchto výsledků se zdá, že moje řazení rozlišuje malá a velká písmena. Zbývající dva řetězce byly nuceny rozlišovat malá a velká písmena, respektive malá a velká písmena.
Podvýrazy
Zde je příklad použití šestého argumentu k vrácení konkrétního vzoru podvýrazu:
SELECT REGEXP_INSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 0, 'i', 1
)
FROM DUAL;
Výsledek:
1
V tomto případě jsem vrátil první podvýraz.
Zde je to, co se stane, když zadám třetí podvýraz:
SELECT REGEXP_INSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 0, 'i', 3
)
FROM DUAL;
Výsledek:
7
Nulové argumenty
S výjimkou 6. argumentu, který poskytuje null
pro argument je výsledkem 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;
Výsledek:
1 2 3 4 5 6 7 _______ _______ _______ _______ _______ ____ _______ null null null null null 0 null
Ve výchozím nastavení vrátí SQLcl a SQL*Plus prázdné místo vždy, když null
dochází v důsledku SQL SELECT
prohlášení.
Můžete však použít SET NULL
určit jiný řetězec, který má být vrácen. Zde jsem uvedl, že řetězec null
by měl být vrácen.
Špatný počet argumentů
Pokud funkci předáte žádné nebo příliš málo argumentů, dojde k chybě:
SELECT REGEXP_INSTR()
FROM DUAL;
Výsledek:
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:
Totéž platí, když předáme příliš mnoho argumentů:
SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops')
FROM DUAL;
Výsledek:
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:
Další informace
REGEXP_INSTR()
funkce (stejně jako další implementace regulárních výrazů společnosti Oracle) odpovídá standardu IEEE Portable Operating System Interface (POSIX) pro regulární výrazy a směrnicím Unicode Regular Expression Guidelines Unicode Consortium.
Další informace a příklady REGEXP_INSTR()
naleznete v dokumentaci k Oracle funkce.