In MariaDB, il REGEXP_INSTR()
La funzione restituisce l'indice iniziale di una sottostringa che corrisponde al modello di espressione regolare.
L'indice inizia da 1
. Se non c'è corrispondenza, il risultato è 0
.
Sintassi
La sintassi è questa:
REGEXP_INSTR(subject, pattern)
Dove subject
è la stringa di input e il pattern
è il modello di espressione regolare per la sottostringa.
Nota che, al momento della scrittura, la versione di MariaDB di REGEXP_INSTR()
accetta meno argomenti rispetto a REGEXP_INSTR()
di MySQL . La versione di MySQL consente di fornire argomenti per la posizione iniziale della ricerca, quale occorrenza cercare, quale tipo di posizione restituire, nonché un modo per perfezionare l'espressione regolare.
Esempio
Ecco un esempio di base:
SELECT REGEXP_INSTR('Cat', 'at');
Risultato:
+---------------------------+ | REGEXP_INSTR('Cat', 'at') | +---------------------------+ | 2 | +---------------------------+
In questo caso c'è una corrispondenza e la sottostringa inizia dalla posizione 2.
Nessuna corrispondenza
Ecco un esempio in cui non c'è corrispondenza:
SELECT REGEXP_INSTR('Cat', '^at');
Risultato:
+----------------------------+ | REGEXP_INSTR('Cat', '^at') | +----------------------------+ | 0 | +----------------------------+
Non c'è corrispondenza, quindi il risultato è 0
. Non c'è corrispondenza perché ho specificato che la stringa deve iniziare con la sottostringa.
Cambiamolo in modo che lo faccia inizia con quella sottostringa:
SELECT REGEXP_INSTR('at', '^at');
Risultato:
+---------------------------+ | REGEXP_INSTR('at', '^at') | +---------------------------+ | 1 | +---------------------------+
Maiuscole/minuscole
Il REGEXP_INSTR()
segue le regole di distinzione tra maiuscole e minuscole delle regole di confronto effettive. La corrispondenza viene eseguita senza distinzione tra maiuscole e minuscole per le regole di confronto senza distinzione tra maiuscole e minuscole e con distinzione tra maiuscole e minuscole per le regole di confronto con distinzione tra maiuscole e minuscole e per i dati binari.
Ecco un esempio:
SELECT
REGEXP_INSTR('Cat', 'c') AS "My Default",
REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_ci, 'c') AS "Case Insensitive",
REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_cs, 'c') AS "Case Sensitive";
Risultato:
+------------+------------------+----------------+ | My Default | Case Insensitive | Case Sensitive | +------------+------------------+----------------+ | 1 | 1 | 0 | +------------+------------------+----------------+
Le mie regole di confronto predefinite non fanno distinzione tra maiuscole e minuscole. Le altre due stringhe sono state forzate rispettivamente a un confronto senza distinzione tra maiuscole e minuscole e con distinzione tra maiuscole e minuscole.
Fornire un BINARY
anche la stringa fa distinzione tra maiuscole e minuscole (vedi sotto).
Stringhe binarie
Per impostazione predefinita, le posizioni sono misurate in caratteri anziché in byte. Tuttavia, puoi trasmettere un set di caratteri multibyte a BINARY
per ottenere offset in byte, se necessario.
Esempio:
SELECT
REGEXP_INSTR('© Cat', 'C') AS "Character",
REGEXP_INSTR(BINARY '© Cat', 'C') AS "Binary";
Risultato:
+-----------+--------+ | Character | Binary | +-----------+--------+ | 3 | 4 | +-----------+--------+
Il simbolo del copyright utilizza due byte, e quindi in questo esempio otteniamo un risultato di 4
quando lo trasmetti a BINARY
, rispetto a 3
che otteniamo diversamente.
Anche se tieni presente che il passaggio di un BINARY
string influisce anche sulla distinzione tra maiuscole e minuscole. Con BINARY
stringhe, un carattere maiuscolo è diverso dalla sua controparte minuscola:
SELECT
REGEXP_INSTR('© Cat', 'c') AS "Character",
REGEXP_INSTR(BINARY '© Cat', 'c') AS "Binary";
Risultato:
+-----------+--------+ | Character | Binary | +-----------+--------+ | 3 | 0 | +-----------+--------+
Qui, ho cercato un c
minuscolo invece di una maiuscola e il BINARY
la stringa non corrispondeva.
Argomenti nulli
Passaggio null
poiché qualsiasi argomento risulta in null
:
SELECT
REGEXP_INSTR(null, 'c') AS "1",
REGEXP_INSTR('Cat', null) AS "2",
REGEXP_INSTR(null, null) AS "3";
Risultato:
+------+------+------+ | 1 | 2 | 3 | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Numero di argomenti errato
Il passaggio di un numero errato di argomenti o di nessun argomento genera un errore:
SELECT REGEXP_INSTR('Cat');
Risultato:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_INSTR'