I Oracle er REGEXP_REPLACE()
funktion erstatter forekomster af understrengen i en streng, der matcher det givne regulære udtryksmønster.
Det udvider funktionaliteten af REPLACE()
funktion ved at tillade os at bruge regulære udtryksmønstre.
Syntaks
Syntaksen ser sådan ud:
REGEXP_REPLACE ( source_char, pattern
[, replace_string
[, position
[, occurrence
[, match_param ]
]
]
]
)
Hvor:
source_char
er et tegnudtryk, der tjener som søgeværdi.pattern
er det regulære udtryk.replace_string
er erstatningsstrengen.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 erstattes. Standarden er0
, hvilket betyder at erstatte alle forekomster.match_param
lader dig ændre funktionens standardmatch-adfærd. For eksempel giver det dig mulighed for at specificere 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 flere oplysninger.
Eksempel
Her er et grundlæggende eksempel på brug af REGEXP_REPLACE()
i Oracle:
SELECT
REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird')
FROM DUAL;
Resultat:
Cats and birds
I dette tilfælde er der et match, og understrengen erstattes med erstatningsstrengen.
Regulære udtryk kan være meget kraftfulde, og dette eksempel bruger et meget simpelt eksempel. For at bruge REGEXP_REPLACE()
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:
SELECT REGEXP_REPLACE('Cats and dogs', 't.g', 'bird');
Resultat:
+------------------------------------------------+ | REGEXP_REPLACE('Cats and dogs', 't.g', 'bird') | +------------------------------------------------+ | Cats and dogs | +------------------------------------------------+
Der er ingen match, så den oprindelige streng returneres uændret.
Flere match
Her er et eksempel med flere matches:
SELECT
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird')
FROM DUAL;
Resultat:
My bird likes other birds
Du kan dog angive, hvilken forekomst der skal erstattes, hvis det kræves:
SELECT
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 1, 2)
FROM DUAL;
Resultat:
My dog likes other birds
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 erstattes. I dette tilfælde erstattes den anden forekomst.
Her er, hvad der sker, hvis jeg starter søgningen efter den første forekomst:
SELECT
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 2)
FROM DUAL;
Resultat:
My dog likes other dogs
I dette tilfælde opdateres strengen ikke, fordi der kun er én forekomst mere efter startpositionen.
Hvis jeg ændrer det sidste argument til 1
, så opdateres det som angivet (fordi det er den første forekomst efter den angivne startposition):
SELECT
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 1)
FROM DUAL;
Resultat:
My dog likes other birds
Og hvis du undrer dig, 0
specificerer alle forekomster:
SELECT REGEXP_REPLACE(
'My dog likes big dogs and small dogs',
'd.g',
'bird', 1, 0
)
FROM DUAL;
Resultat:
My bird likes big birds and small birds
Men den respekterer stadig enhver startposition, der er blevet specificeret:
SELECT REGEXP_REPLACE(
'My dog likes big dogs and small dogs',
'd.g',
'bird', 7, 0
)
FROM DUAL;
Resultat:
My dog likes big birds and small birds
Skrivar og bogstaver
REGEXP_REPLACE()
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 sjette 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_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;
Resultat:
Default Case Insensitive Case Sensitive __________ ___________________ _________________ My Cats My dogs My Cats
Det fremgår af disse resultater, at min standardsortering skelner mellem store og små bogstaver. 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.
Nul-argumenter
Sender null
resulterer i null
for de fleste argumenter, bortset fra det andet og sjette argument:
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;
Resultat:
1 2 3 4 5 6 _______ ______ _______ _______ _______ ______ null Cat null null null Cat
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.
Forkert antal argumenter
Hvis der ikke sendes nogen argumenter til funktionen, eller for få, resulterer det i en fejl:
SELECT REGEXP_REPLACE()
FROM DUAL;
Resultat:
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:
Det samme med at sende for mange argumenter:
SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', 'oops')
FROM DUAL;
Resultat:
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:
Flere oplysninger
REGEXP_REPLACE()
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_REPLACE()
funktion.