I Oracle er REGEXP_SUBSTR()
funktion returnerer en understreng fra en streng baseret på et regulært udtryksmønster.
Det udvider funktionaliteten af SUBSTR()
funktion ved at tillade os at bruge regulære udtryksmønstre.
Syntaks
Syntaksen ser sådan ud:
REGEXP_SUBSTR ( source_char, pattern
[, position
[, occurrence
[, match_param
[, subexpr ]
]
]
]
)
Hvor:
source_char
er et tegnudtryk, der tjener som søgeværdi.pattern
er det regulære udtryk.position
er et positivt heltal, der angiver, hvor søgningen skal begynde. Standarden er1
, hvilket betyder, start søgningen ved det første tegn.occurrence
er et ikke-negativt heltal, der angiver, hvilken forekomst der skal søges efter. Standarden er1
, hvilket betyder søgninger efter den første forekomst.match_param
lader dig ændre funktionens standardmatch-adfærd. For eksempel giver det dig mulighed for at angive forskel på store og små bogstaver, hvordan flere linjer og mellemrum behandles osv. Dette argument fungerer på samme måde, som når det bruges medREGEXP_COUNT()
fungere. Se Oracles dokumentation for den funktion for at få flere oplysninger.- For et
pattern
med underudtryk,subexpr
er et ikke-negativt heltal fra 0 til 9, der angiver hvilket underudtryk ipattern
skal returneres af funktionen. Dette argument fungerer på samme måde, som når det bruges medREGEXP_INSTR()
fungere. Se Oracles dokumentation for den funktion for flere oplysninger.
Eksempel
Her er et grundlæggende eksempel på brug af REGEXP_SUBSTR()
i Oracle:
SELECT
REGEXP_SUBSTR('Cats and dogs', 'd.g')
FROM DUAL;
Resultat:
hund
I dette tilfælde er der et match, og den første (og i dette tilfælde kun) matchende understreng returneres.
Regulære udtryk kan være meget kraftfulde, og dette eksempel bruger et meget simpelt eksempel. For at bruge REGEXP_SUBSTR()
effektivt, skal du kende det korrekte mønster til at bruge til det ønskede resultat.
Ingen match
Her er et eksempel, hvor der ikke er nogen match:
SET NULL 'null';
SELECT REGEXP_SUBSTR('My dogs like dregs', 't.g')
FROM DUAL;
Resultat:
null
Der er ingen match, så null
er returneret.
Som standard returnerer SQLcl og SQL*Plus et tomt mellemrum, når null
opstår som et resultat af en SQL SELECT
udmelding.
Du kan dog bruge SET NULL
for at angive en anden streng, der skal returneres. Her specificerede jeg, at strengen null
skal returneres.
Flere match
Her er et eksempel med flere matches:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g')
FROM DUAL;
Resultat:
hund
Du kan dog angive, hvilken forekomst der skal erstattes, hvis det kræves:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;
Resultat:
dag
Bemærk, at jeg tilføjede to argumenter her; 1
og 2
. 1
angiver opholdssted i strengen for at starte søgningen (i dette tilfælde ved det første tegn). 2
er det, der specificerer, hvilken forekomst der skal søges efter. I dette tilfælde søges der efter den anden forekomst.
Her er, hvad der sker, hvis jeg starter søgningen efter den første forekomst:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;
Resultat:
null
I dette tilfælde er der ingen match, fordi der kun er én forekomst mere efter startpositionen.
Hvis jeg ændrer det sidste argument til 1
, så får vi et match (fordi det er den første forekomst efter den angivne startposition):
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;
Resultat:
dag
Skrivar og bogstaver
REGEXP_SUBSTR()
funktionen følger Oracles sorteringsbestemmelse og afledningsregler, som definerer den sortering, der skal bruges, når strengen matches med mønsteret.
Du kan dog udtrykkeligt angive følsomhed mellem store og små bogstaver med det valgfri femte argument. Når du gør dette, tilsidesætter det enhver følsomhed mellem store og små bogstaver eller accentfølsomhed for den bestemte sortering.
Du kan angive i
til forskellen mellem store og små bogstaver og c
for store og små bogstaver.
Her er et eksempel:
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;
Resultat:
Default Uafhængig af store og små bogstaver.Min sortering ser ud til at skelne mellem store og små bogstaver, baseret på disse resultater. De to andre strenge blev tvunget til en matchning, der skelner mellem store og små bogstaver, og en matchning, der skelner mellem store og små bogstaver.
Underudtryk
Her er et eksempel på brug af det sjette argument til at returnere et specifikt underudtryksmønster:
SELECT REGEXP_SUBSTR( 'catdogcow', '(c.t)(d.g)(c.w)', 1, 1, 'i', 1 ) FROM DUAL;
Resultat:
katI dette tilfælde returnerede jeg det første underudtryk.
Her er, hvad der sker, hvis jeg angiver det tredje underudtryk:
SELECT REGEXP_SUBSTR( 'catdogcow', '(c.t)(d.g)(c.w)', 1, 1, 'i', 3 ) FROM DUAL;
Resultat:
koNul-argumenter
Hvis et argument er
null
, resultatet ernull
: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;
Resultat:
1 2 3 4 5 6 _______ _______ _______ _______ _______ _______ null null null null null nullForkert antal argumenter
Hvis der ikke sendes nogen argumenter til funktionen, eller for få, resulterer det i en fejl:
SELECT REGEXP_SUBSTR() FROM DUAL;
Resultat:
Fejl starter på linje :1 i kommando -SELECT REGEXP_SUBSTR()FROM DUAL Fejl på kommandolinje :1 Kolonne :8Fejlrapport -SQL-fejl:ORA-00938:ikke nok argumenter til funktion00938. 00000 - "ikke nok argumenter for funktion"*Årsag:*Handling:Det samme gælder, når vi sender for mange argumenter:
SELECT REGEXP_SUBSTR('Cat', 'c.t', 1, 1, 'i', 1, 'oops') FROM DUAL;
Resultat:
Fejl starter på linje:1 i kommando -SELECT REGEXP_SUBSTR('Cat', 'c.t', 1, 1, 'i', 1, 'ups')FRA DUALEfejl på kommandolinje:1 Kolonne:8Fejlrapport -SQL-fejl:ORA-00939:for mange argumenter til funktion00939. 00000 - "for mange argumenter for funktion"*Årsag:*Handling:Flere oplysninger
REGEXP_SUBSTR()
funktion (såvel som Oracles øvrige implementering af regulære udtryk) er i overensstemmelse med IEEE Portable Operating System Interface (POSIX) regulære udtryksstandard og Unicode Regular Expression Guidelines fra Unicode Consortium.Se Oracle-dokumentationen for mere information og eksempler på
REGEXP_SUBSTR()
funktion.