MariaDB
 sql >> Database >  >> RDS >> MariaDB

Come funziona REGEXP_INSTR() in MariaDB

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'