In Oracle, il REGEXP_SUBSTR()
La funzione restituisce una sottostringa da una stringa, in base a un modello di espressione regolare.
Estende la funzionalità di SUBSTR()
funzione consentendoci di utilizzare modelli di espressioni regolari.
Sintassi
La sintassi è questa:
REGEXP_SUBSTR ( source_char, pattern
[, position
[, occurrence
[, match_param
[, subexpr ]
]
]
]
)
Dove:
source_char
è un'espressione di carattere che funge da valore di ricerca.pattern
è l'espressione regolare.position
è un numero intero positivo che specifica da dove iniziare la ricerca. L'impostazione predefinita è1
, ovvero avvia la ricerca dal primo carattere.occurrence
è un numero intero non negativo che specifica quale occorrenza cercare. L'impostazione predefinita è1
, il che significa che cerca la prima occorrenza.match_param
consente di modificare il comportamento di corrispondenza predefinito della funzione. Ad esempio, consente di specificare la distinzione tra maiuscole e minuscole, come vengono gestite più righe e spazi, ecc. Questo argomento funziona allo stesso modo di quando viene utilizzato conREGEXP_COUNT()
funzione. Consulta la documentazione di Oracle per quella funzione per ulteriori informazioni.- Per un
pattern
con sottoespressioni,subexpr
è un numero intero non negativo da 0 a 9 che indica quale sottoespressione inpattern
deve essere restituito dalla funzione. Questo argomento funziona allo stesso modo di quando viene utilizzato conREGEXP_INSTR()
funzione. Consulta la documentazione di Oracle per ulteriori informazioni su tale funzione.
Esempio
Ecco un esempio di base dell'utilizzo di REGEXP_SUBSTR()
in Oracle:
SELECT
REGEXP_SUBSTR('Cats and dogs', 'd.g')
FROM DUAL;
Risultato:
dog
In questo caso c'è una corrispondenza e viene restituita la prima (e in questo caso l'unica) sottostringa corrispondente.
Le espressioni regolari possono essere molto potenti e questo esempio usa un esempio molto semplice. Per utilizzare REGEXP_SUBSTR()
in modo efficace, dovrai conoscere lo schema corretto da utilizzare per il risultato desiderato.
Nessuna corrispondenza
Ecco un esempio in cui non c'è corrispondenza:
SET NULL 'null';
SELECT REGEXP_SUBSTR('My dogs like dregs', 't.g')
FROM DUAL;
Risultato:
null
Non c'è corrispondenza, quindi null
viene restituito.
Per impostazione predefinita, SQLcl e SQL*Plus restituiscono uno spazio vuoto ogni volta che null
si verifica come risultato di un SQL SELECT
dichiarazione.
Tuttavia, puoi utilizzare SET NULL
per specificare una stringa diversa da restituire. Qui ho specificato che la stringa null
deve essere restituito.
Partite multiple
Ecco un esempio con più corrispondenze:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g')
FROM DUAL;
Risultato:
dog
Tuttavia, puoi specificare quale occorrenza sostituire se necessario:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;
Risultato:
dag
Nota che ho aggiunto due argomenti qui; 1
e 2
. Il 1
specifica dove si trova nella stringa per avviare la ricerca (in questo caso, al primo carattere). Il 2
è ciò che specifica quale occorrenza cercare. In questo caso, viene cercata la seconda occorrenza.
Ecco cosa succede se avvio la ricerca dopo la prima occorrenza:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;
Risultato:
null
In questo caso non c'è corrispondenza, perché c'è solo un'altra occorrenza dopo la posizione di partenza.
Se cambio l'ultimo argomento in 1
, quindi otteniamo una corrispondenza (perché è la prima occorrenza dopo la posizione iniziale specificata):
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;
Risultato:
dag
Maiuscole/minuscole
Il REGEXP_SUBSTR()
segue le regole di determinazione e derivazione delle regole di confronto di Oracle, che definiscono le regole di confronto da utilizzare quando si confronta la stringa con il modello.
Tuttavia, puoi specificare esplicitamente la distinzione tra maiuscole e minuscole con il quinto argomento facoltativo. Quando lo fai, sovrascrive qualsiasi distinzione tra maiuscole e minuscole o sensibilità all'accento delle regole di confronto determinate.
Puoi specificare i
per la corrispondenza senza distinzione tra maiuscole e minuscole e c
per la corrispondenza con distinzione tra maiuscole e minuscole.
Ecco un esempio:
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;
Risultato:
Default Case Insensitive Case Sensitive __________ ___________________ _________________ null Cat null
La mia raccolta sembra distinguere tra maiuscole e minuscole, sulla base di questi risultati. Le altre due stringhe sono state forzate rispettivamente a una corrispondenza senza distinzione tra maiuscole e minuscole.
Sottoespressioni
Ecco un esempio di utilizzo del sesto argomento per restituire un modello di sottoespressione specifico:
SELECT REGEXP_SUBSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 'i', 1
)
FROM DUAL;
Risultato:
cat
In questo caso ho restituito la prima sottoespressione.
Ecco cosa succede se specifico la terza sottoespressione:
SELECT REGEXP_SUBSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 'i', 3
)
FROM DUAL;
Risultato:
cow
Argomenti nulli
Se un argomento è null
, il risultato è 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;
Risultato:
1 2 3 4 5 6 _______ _______ _______ _______ _______ _______ null null null null null null
Numero di argomenti errato
Se non si passano argomenti alla funzione, o se sono troppo pochi, si verifica un errore:
SELECT REGEXP_SUBSTR()
FROM DUAL;
Risultato:
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:
Lo stesso vale quando passiamo troppi argomenti:
SELECT REGEXP_SUBSTR('Cat', 'c.t', 1, 1, 'i', 1, 'oops')
FROM DUAL;
Risultato:
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:
Maggiori informazioni
Il REGEXP_SUBSTR()
funzione (così come l'altra implementazione di espressioni regolari di Oracle) è conforme allo standard delle espressioni regolari POSIX (Portable Operating System Interface) IEEE e alle Linee guida per le espressioni regolari Unicode di Unicode Consortium.
Consulta la documentazione Oracle per ulteriori informazioni ed esempi di REGEXP_SUBSTR()
funzione.