sql >> Database >  >> RDS >> Oracle

REGEXP_REPLACE() Functie in Oracle

In Oracle, de REGEXP_REPLACE() functie vervangt de subtekenreeks binnen een tekenreeks die overeenkomt met het gegeven patroon voor reguliere expressies.

Het breidt de functionaliteit van de REPLACE() functie door ons in staat te stellen patronen voor reguliere expressies te gebruiken.

Syntaxis

De syntaxis gaat als volgt:

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

Waar:

  • source_char is een tekenuitdrukking die als zoekwaarde dient.
  • pattern is de reguliere expressie.
  • replace_string is de vervangende string.
  • position is een positief geheel getal dat aangeeft waar de zoekopdracht moet beginnen. De standaard is 1 , wat betekent:begin met zoeken bij het eerste teken.
  • occurrence is een niet-negatief geheel getal dat aangeeft welk exemplaar moet worden vervangen. De standaard is 0 , wat betekent dat alle exemplaren moeten worden vervangen.
  • match_param laat je het standaard matchgedrag van de functie wijzigen. U kunt bijvoorbeeld hoofdlettergevoeligheid specificeren, hoe meerdere regels en spaties worden behandeld, enz. Dit argument werkt hetzelfde als wanneer het wordt gebruikt met de REGEXP_COUNT() functie. Zie de documentatie van Oracle voor meer informatie.

Voorbeeld

Hier is een eenvoudig voorbeeld van het gebruik van REGEXP_REPLACE() in Orakel:

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

Resultaat:

Cats and birds

In dit geval is er een overeenkomst en wordt de substring vervangen door de vervangende string.

Reguliere expressies kunnen erg krachtig zijn, en in dit voorbeeld wordt een heel eenvoudig voorbeeld gebruikt. Om REGEXP_REPLACE() . te gebruiken effectief is, moet u het juiste patroon kennen om te gebruiken voor het gewenste resultaat.

Geen overeenkomst

Hier is een voorbeeld waarbij er geen overeenkomst is:

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

Resultaat:

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

Er is geen overeenkomst, dus de oorspronkelijke tekenreeks wordt ongewijzigd geretourneerd.

Meerdere wedstrijden

Hier is een voorbeeld met meerdere overeenkomsten:

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

Resultaat:

My bird likes other birds

U kunt echter specificeren welke instantie moet worden vervangen indien nodig:

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

Resultaat:

My dog likes other birds

Merk op dat ik hier twee argumenten heb toegevoegd – 1 en 2 . De 1 specificeert de verblijfplaats in de tekenreeks om de zoekopdracht te starten (in dit geval bij het eerste teken). De 2 is wat specificeert welk voorkomen moet worden vervangen. In dit geval wordt de tweede instantie vervangen.

Dit is wat er gebeurt als ik de zoekopdracht start na de eerste keer dat ik deze zoek:

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

Resultaat:

My dog likes other dogs

In dit geval wordt de tekenreeks niet bijgewerkt, omdat er nog maar één keer voorkomt na de startpositie.

Als ik het laatste argument verander in 1 , dan wordt het bijgewerkt zoals gespecificeerd (omdat het de eerste keer is dat het voorkomt na de gespecificeerde startpositie):

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

Resultaat:

My dog likes other birds

En voor het geval je het je afvraagt:0 specificeert alle gebeurtenissen:

SELECT REGEXP_REPLACE(
    'My dog likes big dogs and small dogs', 
    'd.g', 
    'bird', 1, 0
    )
FROM DUAL;

Resultaat:

My bird likes big birds and small birds

Maar het respecteert nog steeds elke startpositie die is opgegeven:

SELECT REGEXP_REPLACE(
    'My dog likes big dogs and small dogs', 
    'd.g', 
    'bird', 7, 0
    )
FROM DUAL;

Resultaat:

My dog likes big birds and small birds

Hoofdlettergevoeligheid

De REGEXP_REPLACE() functie volgt de sorteerbepalings- en afleidingsregels van Oracle, die de sortering definiëren die moet worden gebruikt bij het matchen van de tekenreeks met het patroon.

U kunt echter expliciet hoofdlettergevoeligheid specificeren met het optionele zesde argument. Wanneer u dit doet, heft het elke hoofdlettergevoeligheid of accentgevoeligheid van de bepaalde sortering op.

U kunt i . specificeren voor hoofdletterongevoelige overeenkomsten en c voor hoofdlettergevoelige overeenkomsten.

Hier is een voorbeeld:

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;

Resultaat:

   Default    Case Insensitive    Case Sensitive 
__________ ___________________ _________________ 
My Cats    My dogs             My Cats         

Uit deze resultaten blijkt dat mijn standaardsortering hoofdlettergevoelig is. De andere twee strings werden gedwongen om respectievelijk hoofdletterongevoelig en hoofdlettergevoelig te matchen.

Nullargumenten

Doorgeven van null resulteert in null voor de meeste argumenten, behalve voor het tweede en zesde 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;

Resultaat:

      1      2       3       4       5      6 
_______ ______ _______ _______ _______ ______ 
null    Cat    null    null    null    Cat   

Standaard retourneren SQLcl en SQL*Plus een spatie wanneer null treedt op als resultaat van een SQL SELECT uitspraak.

U kunt echter SET NULL . gebruiken om een ​​andere tekenreeks op te geven die moet worden geretourneerd. Hier heb ik gespecificeerd dat de string null moet worden geretourneerd.

Onjuist aantal argumenten

Geen of te weinig argumenten aan de functie doorgeven, resulteert in een fout:

SELECT REGEXP_REPLACE()
FROM DUAL;

Resultaat:

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:

Hetzelfde geldt voor het doorgeven van te veel argumenten:

SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', 'oops')
FROM DUAL;

Resultaat:

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:

Meer informatie

De REGEXP_REPLACE() functie (evenals Oracle's andere implementatie van reguliere expressies) voldoet aan de IEEE Portable Operating System Interface (POSIX) reguliere expressiestandaard en aan de Unicode Regular Expression Guidelines van het Unicode Consortium.

Zie de Oracle-documentatie voor meer informatie en voorbeelden van de REGEXP_REPLACE() functie.


  1. Hoe de SQL Server SOUNDEX()-functie werkt

  2. Hoe de primaire sleutel bij te werken

  3. Waarschuwingen en operators gebruiken in SQL Server

  4. Android:hoe de afbeelding dynamisch van de server te laden op naam van SQlite