In Oracle, de REGEXP_SUBSTR()
functie retourneert een subtekenreeks van een tekenreeks, gebaseerd op een patroon voor reguliere expressies.
Het breidt de functionaliteit van de SUBSTR()
. uit functie door ons in staat te stellen patronen voor reguliere expressies te gebruiken.
Syntaxis
De syntaxis gaat als volgt:
REGEXP_SUBSTR ( source_char, pattern
[, position
[, occurrence
[, match_param
[, subexpr ]
]
]
]
)
Waar:
source_char
is een tekenuitdrukking die als zoekwaarde dient.pattern
is de reguliere expressie.position
is een positief geheel getal dat aangeeft waar de zoekopdracht moet beginnen. De standaard is1
, wat betekent:begin met zoeken bij het eerste teken.occurrence
is een niet-negatief geheel getal dat aangeeft naar welke gebeurtenis moet worden gezocht. De standaard is1
, wat betekent dat er wordt gezocht naar het eerste exemplaar.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 deREGEXP_COUNT()
functie. Zie de documentatie van Oracle voor die functie voor meer informatie.- Voor een
pattern
met subexpressies,subexpr
is een niet-negatief geheel getal van 0 tot 9 dat aangeeft welke subuitdrukking inpattern
moet worden geretourneerd door de functie. Dit argument werkt hetzelfde als wanneer het wordt gebruikt met deREGEXP_INSTR()
functie. Zie de documentatie van Oracle voor die functie voor meer informatie.
Voorbeeld
Hier is een eenvoudig voorbeeld van het gebruik van REGEXP_SUBSTR()
in Orakel:
SELECT
REGEXP_SUBSTR('Cats and dogs', 'd.g')
FROM DUAL;
Resultaat:
dog
In dit geval is er een overeenkomst en wordt de eerste (en in dit geval enige) overeenkomende subtekenreeks geretourneerd.
Reguliere expressies kunnen erg krachtig zijn, en in dit voorbeeld wordt een heel eenvoudig voorbeeld gebruikt. Om REGEXP_SUBSTR()
. 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:
SET NULL 'null';
SELECT REGEXP_SUBSTR('My dogs like dregs', 't.g')
FROM DUAL;
Resultaat:
null
Er is geen overeenkomst, dus null
wordt geretourneerd.
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.
Meerdere wedstrijden
Hier is een voorbeeld met meerdere overeenkomsten:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g')
FROM DUAL;
Resultaat:
dog
U kunt echter specificeren welke instantie moet worden vervangen indien nodig:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;
Resultaat:
dag
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 naar welke gebeurtenis moet worden gezocht. In dit geval wordt naar de tweede instantie gezocht.
Dit is wat er gebeurt als ik de zoekopdracht start na de eerste keer dat ik deze zoek:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;
Resultaat:
null
In dit geval is er geen match, omdat er nog maar één keer voorkomt na de startpositie.
Als ik het laatste argument verander in 1
, dan krijgen we een overeenkomst (omdat dit de eerste keer is na de opgegeven startpositie):
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;
Resultaat:
dag
Hoofdlettergevoeligheid
De REGEXP_SUBSTR()
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 vijfde 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_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;
Resultaat:
Default Case Insensitive Case Sensitive __________ ___________________ _________________ null Cat null
Op basis van deze resultaten lijkt mijn sortering hoofdlettergevoelig. De andere twee strings werden gedwongen om respectievelijk hoofdletterongevoelig en hoofdlettergevoelig te matchen.
Subexpressies
Hier is een voorbeeld van het gebruik van het zesde argument om een specifiek subexpressiepatroon te retourneren:
SELECT REGEXP_SUBSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 'i', 1
)
FROM DUAL;
Resultaat:
cat
In dit geval heb ik de eerste subexpressie geretourneerd.
Dit is wat er gebeurt als ik de derde subexpressie specificeer:
SELECT REGEXP_SUBSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 'i', 3
)
FROM DUAL;
Resultaat:
cow
Nullargumenten
Als een argument null
is , het resultaat is null
:
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;
Resultaat:
1 2 3 4 5 6 _______ _______ _______ _______ _______ _______ null null null null null null
Onjuist aantal argumenten
Geen of te weinig argumenten aan de functie doorgeven, resulteert in een fout:
SELECT REGEXP_SUBSTR()
FROM DUAL;
Resultaat:
Error starting at line : 1 in command - SELECT REGEXP_SUBSTR() 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 wanneer we te veel argumenten doorgeven:
SELECT REGEXP_SUBSTR('Cat', 'c.t', 1, 1, 'i', 1, 'oops')
FROM DUAL;
Resultaat:
Error starting at line : 1 in command - SELECT REGEXP_SUBSTR('Cat', 'c.t', 1, 1, 'i', 1, '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_SUBSTR()
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_SUBSTR()
functie.