sql >> Database >  >> RDS >> Oracle

REGEXP_INSTR() Functie in Oracle

In Oracle, de REGEXP_INSTR() functie zoekt in een tekenreeks naar een patroon voor reguliere expressies. Het geeft een geheel getal terug dat de begin- of eindpositie van de overeenkomende subtekenreeks aangeeft (welke je ook opgeeft).

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

Syntaxis

De syntaxis gaat als volgt:

REGEXP_INSTR ( source_char, pattern
               [, position
                  [, occurrence
                     [, return_opt
                        [, 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 is 1 , wat betekent:begin met zoeken bij het eerste teken.
  • occurrence is een positief geheel getal dat aangeeft naar welke gebeurtenis moet worden gezocht. De standaard is 1 , wat betekent dat er wordt gezocht naar het eerste exemplaar.
  • return_opt specificeert of Oracle de begin- of eindpositie van de overeenkomende substring moet retourneren. Gebruik 0 voor het begin, en 1 voor het einde. De standaardwaarde is 0 .
  • 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 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 in pattern moet worden geretourneerd door de functie. Dit argument werkt hetzelfde als wanneer het wordt gebruikt met de REGEXP_INSTR() functie. Zie de documentatie van Oracle voor die functie voor meer informatie.

Voorbeeld

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

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g')
FROM DUAL;

Resultaat:

4

In dit geval is er een overeenkomst en wordt de beginpositie van de substring geretourneerd.

Reguliere expressies kunnen erg krachtig zijn, en in dit voorbeeld wordt een heel eenvoudig voorbeeld gebruikt. Om REGEXP_INSTR() . 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_INSTR('My dogs like dregs', 't.g')
FROM DUAL;

Resultaat:

0

Er is geen overeenkomst, dus 0 wordt geretourneerd.

Meerdere wedstrijden

Hier is een voorbeeld met meerdere overeenkomsten:

SELECT 
    REGEXP_INSTR('My dogs have dags', 'd.g')
FROM DUAL;

Resultaat:

4

Het keerde terug naar de positie van het eerste voorkomen.

U kunt echter aangeven welk exemplaar u wilt vervangen:

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;

Resultaat:

14

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_INSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;

Resultaat:

0

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_INSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;

Resultaat:

14

Retourneer de eindpositie

U kunt een vijfde argument van 0 . doorgeven of 1 om aan te geven of de functie de begin- of eindpositie van de subtekenreeks moet retourneren.

De standaardwaarde is 0 (voor de beginpositie). Dit is wat er gebeurt als we 1 specificeren :

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1)
FROM DUAL;

Resultaat:

7

Voor de duidelijkheid, hier is het weer in vergelijking met 0 :

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 0) AS "Start",
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1) AS "End"
FROM DUAL;

Resultaat:

   Start    End 
________ ______ 
       4      7

Hoofdlettergevoeligheid

De REGEXP_INSTR() 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_INSTR('My Cats', 'c.t', 1, 1, 0) AS "Default",
    REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0, 'i') AS "Case Insensitive",
    REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0, 'c') AS "Case Sensitive"
FROM DUAL;

Resultaat:

   Default    Case Insensitive    Case Sensitive 
__________ ___________________ _________________ 
         0                   4                 0

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_INSTR(
    'catdogcow', 
    '(c.t)(d.g)(c.w)', 
    1, 1, 0, 'i', 1
    )
FROM DUAL;

Resultaat:

1

In dit geval heb ik de eerste subexpressie geretourneerd.

Dit is wat er gebeurt als ik de derde subexpressie specificeer:

SELECT REGEXP_INSTR(
    'catdogcow', 
    '(c.t)(d.g)(c.w)', 
    1, 1, 0, 'i', 3
    )
FROM DUAL;

Resultaat:

7

Nullargumenten

Met uitzondering van het 6e argument, het verstrekken van null voor een argument resulteert in null :

SET NULL 'null';
SELECT 
    REGEXP_INSTR(null, 'c.t', 1, 1, 0, 'i', 1) AS "1",
    REGEXP_INSTR('Cat', null, 1, 1, 0, 'i', 1) AS "2",
    REGEXP_INSTR('Cat', 'c.t', null, 1, 0, 'i', 1) AS "3",
    REGEXP_INSTR('Cat', 'c.t', 1, null, 0, 'i', 1) AS "4",
    REGEXP_INSTR('Cat', 'c.t', 1, 1, null, 'i', 1) AS "5",
    REGEXP_INSTR('Cat', 'c.t', 1, 1, 0, null, 1) AS "6",
    REGEXP_INSTR('Cat', 'c.t', 1, 1, 0, 'i', null) AS "7"
FROM DUAL;

Resultaat:

      1       2       3       4       5    6       7 
_______ _______ _______ _______ _______ ____ _______ 
   null    null    null    null    null    0    null 

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_INSTR()
FROM DUAL;

Resultaat:

Error starting at line : 1 in command -
SELECT REGEXP_INSTR()
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_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops')
FROM DUAL;

Resultaat:

Error starting at line : 1 in command -
SELECT REGEXP_INSTR('Cat', 'c.t', 1, 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_INSTR() 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_INSTR() functie.


  1. Is het een slecht ontwerp om arrays in een database te gebruiken?

  2. Tellen van het aantal samengevoegde rijen in de linker join

  3. Postgres-caches/buffers zien en wissen?

  4. Hoe de MySQL-versie te controleren?