sql >> Databasteknik >  >> RDS >> Oracle

REGEXP_REPLACE() Funktion i Oracle

I Oracle, REGEXP_REPLACE() funktion ersätter förekomster av delsträngen i en sträng som matchar det givna reguljära uttrycksmönstret.

Det utökar funktionaliteten för REPLACE() funktion genom att tillåta oss att använda reguljära uttrycksmönster.

Syntax

Syntaxen ser ut så här:

REGEXP_REPLACE ( source_char, pattern
                 [, replace_string
                    [, position
                       [, occurrence
                          [, match_param ]
                       ]
                    ]
                 ]
               )

Var:

  • source_char är ett teckenuttryck som fungerar som sökvärde.
  • pattern är det reguljära uttrycket.
  • replace_string är ersättningssträngen.
  • position är ett positivt heltal som anger var sökningen ska börja. Standard är 1 , vilket betyder, starta sökningen vid det första tecknet.
  • occurrence är ett icke-negativt heltal som anger vilken förekomst som ska ersättas. Standard är 0 , vilket innebär att ersätta alla förekomster.
  • match_param låter dig ändra standardmatchningsbeteendet för funktionen. Det låter dig till exempel ange skiftlägeskänslighet, hur flera rader och mellanslag hanteras, etc. Detta argument fungerar på samma sätt som när det används med REGEXP_COUNT() fungera. Se Oracles dokumentation för mer information.

Exempel

Här är ett grundläggande exempel på hur du använder REGEXP_REPLACE() i Oracle:

SELECT 
    REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird')
FROM DUAL;

Resultat:

Cats and birds

I det här fallet finns det en matchning och delsträngen ersätts med ersättningssträngen.

Reguljära uttryck kan vara mycket kraftfulla, och det här exemplet använder ett mycket enkelt exempel. För att använda REGEXP_REPLACE() i praktiken måste du känna till det korrekta mönstret att använda för det önskade resultatet.

Ingen match

Här är ett exempel där det inte finns någon matchning:

SELECT REGEXP_REPLACE('Cats and dogs', 't.g', 'bird');

Resultat:

+------------------------------------------------+
| REGEXP_REPLACE('Cats and dogs', 't.g', 'bird') |
+------------------------------------------------+
| Cats and dogs                                  |
+------------------------------------------------+

Det finns ingen matchning, så den ursprungliga strängen returneras oförändrad.

Flera matchningar

Här är ett exempel med flera matchningar:

SELECT 
    REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird')
FROM DUAL;

Resultat:

My bird likes other birds

Du kan dock ange vilken förekomst som ska ersättas om det behövs:

SELECT 
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 1, 2)
FROM DUAL;

Resultat:

My dog likes other birds

Observera att jag har lagt till två argument här – 1 och 2 . 1 anger var i strängen för att starta sökningen (i det här fallet vid det första tecknet). 2 är det som anger vilken händelse som ska ersättas. I detta fall ersätts den andra förekomsten.

Så här händer om jag startar sökningen efter den första händelsen:

SELECT 
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 2)
FROM DUAL;

Resultat:

My dog likes other dogs

I det här fallet uppdateras inte strängen eftersom det bara finns en till efter startpositionen.

Om jag ändrar det sista argumentet till 1 , sedan uppdateras den som specificerat (eftersom det är den första förekomsten efter den angivna startpositionen):

SELECT 
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 1)
FROM DUAL;

Resultat:

My dog likes other birds

Och om du undrar, 0 anger alla förekomster:

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 respekterar fortfarande alla startpositioner som har specificerats:

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

Skaftkänslighet

REGEXP_REPLACE() funktionen följer Oracles sorteringsbestämning och härledningsregler, som definierar sorteringen som ska användas när strängen matchas med mönstret.

Du kan dock uttryckligen ange skiftlägeskänslighet med det valfria sjätte argumentet. När du gör detta åsidosätter det all skiftlägeskänslighet eller accentkänslighet för den fastställda sorteringen.

Du kan ange i för skiftlägesokänslig matchning och c för skiftlägeskänslig matchning.

Här är ett exempel:

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 framgår av dessa resultat att min standardsortering är skiftlägeskänslig. De andra två strängarna tvingades till en skiftlägesokänslig respektive skiftlägeskänslig matchning.

Nollargument

Skickar null resulterar i null för de flesta argument, förutom det andra och sjätte argumentet:

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 returnerar SQLcl och SQL*Plus ett tomt utrymme när null uppstår som ett resultat av en SQL SELECT påstående.

Du kan dock använda SET NULL för att ange en annan sträng som ska returneras. Här specificerade jag att strängen null bör returneras.

Fel antal argument

Att skicka inga argument till funktionen, eller för få, resulterar i ett fel:

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:

Samma sak med att skicka för många argument:

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:

Mer information

REGEXP_REPLACE() funktion (liksom Oracles andra implementering av reguljära uttryck) överensstämmer med IEEE Portable Operating System Interface (POSIX) reguljära uttrycksstandard och Unicode Regular Expression Guidelines från Unicode Consortium.

Se Oracle-dokumentationen för mer information och exempel på REGEXP_REPLACE() funktion.


  1. Kopiera en tabell (inklusive index) i postgres

  2. Hur konfigurerar jag HikariCP för postgresql?

  3. Ta bort dubbletter av rader från en liten tabell

  4. Hur konverterar jag från BLOB till TEXT i MySQL?