sql >> Database teknologi >  >> RDS >> Oracle

REGEXP_REPLACE() Funktion i Oracle

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 er 1 , hvilket betyder, start søgningen ved det første tegn.
  • occurrence er et ikke-negativt heltal, der angiver, hvilken forekomst der skal erstattes. Standarden er 0 , 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 med REGEXP_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.


  1. Parse filnavn og sti fra fuld sti

  2. MySQL Forkert datetime-værdi:'0000-00-00 00:00:00'

  3. Sådan viser du alle tabeller i Oracle

  4. Sådan migreres Standalone Moodle til en skalerbar opsætning i grupperet database