Dans MariaDB, le REGEXP_INSTR()
renvoie l'index de départ d'une sous-chaîne qui correspond au modèle d'expression régulière.
L'index commence à 1
. S'il n'y a pas de correspondance, le résultat est 0
.
Syntaxe
La syntaxe ressemble à ceci :
REGEXP_INSTR(subject, pattern)
Où subject
est la chaîne d'entrée et le pattern
est le modèle d'expression régulière pour la sous-chaîne.
Notez qu'au moment de la rédaction, la version de MariaDB de REGEXP_INSTR()
accepte moins d'arguments que REGEXP_INSTR()
de MySQL . La version de MySQL vous permet de fournir des arguments pour la position de départ de la recherche, l'occurrence à rechercher, le type de position à renvoyer, ainsi qu'un moyen d'affiner l'expression régulière.
Exemple
Voici un exemple de base :
SELECT REGEXP_INSTR('Cat', 'at');
Résultat :
+---------------------------+ | REGEXP_INSTR('Cat', 'at') | +---------------------------+ | 2 | +---------------------------+
Dans ce cas, il y a correspondance et la sous-chaîne commence à la position 2.
Aucune correspondance
Voici un exemple où il n'y a pas de correspondance :
SELECT REGEXP_INSTR('Cat', '^at');
Résultat :
+----------------------------+ | REGEXP_INSTR('Cat', '^at') | +----------------------------+ | 0 | +----------------------------+
Il n'y a pas de correspondance, donc le résultat est 0
. Il n'y a pas de correspondance car j'ai spécifié que la chaîne doit commencer par la sous-chaîne.
Modifions-le pour qu'il le fasse commencer par cette sous-chaîne :
SELECT REGEXP_INSTR('at', '^at');
Résultat :
+---------------------------+ | REGEXP_INSTR('at', '^at') | +---------------------------+ | 1 | +---------------------------+
Sensibilité à la casse
Le REGEXP_INSTR()
suit les règles de sensibilité à la casse du classement effectif. La correspondance est effectuée de manière insensible à la casse pour les classements insensibles à la casse, et sensible à la casse pour les classements sensibles à la casse et pour les données binaires.
Voici un exemple :
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";
Résultat :
+------------+------------------+----------------+ | My Default | Case Insensitive | Case Sensitive | +------------+------------------+----------------+ | 1 | 1 | 0 | +------------+------------------+----------------+
Mon classement par défaut est insensible à la casse. Les deux autres chaînes ont été forcées respectivement à un classement insensible à la casse et à un classement sensible à la casse.
Fournir un BINARY
la chaîne est également sensible à la casse (voir ci-dessous).
Chaînes binaires
Par défaut, les positions sont mesurées en caractères plutôt qu'en octets. Cependant, vous pouvez convertir un jeu de caractères multi-octets en BINARY
pour obtenir des décalages en octets si nécessaire.
Exemple :
SELECT
REGEXP_INSTR('© Cat', 'C') AS "Character",
REGEXP_INSTR(BINARY '© Cat', 'C') AS "Binary";
Résultat :
+-----------+--------+ | Character | Binary | +-----------+--------+ | 3 | 4 | +-----------+--------+
Le symbole de copyright utilise deux octets, et donc dans cet exemple nous obtenons un résultat de 4
lors de la conversion en BINARY
, contre 3
que nous obtenons autrement.
Notez bien que le passage d'un BINARY
chaîne affecte également la sensibilité à la casse. Avec BINARY
chaînes, un caractère majuscule est différent de son homologue minuscule :
SELECT
REGEXP_INSTR('© Cat', 'c') AS "Character",
REGEXP_INSTR(BINARY '© Cat', 'c') AS "Binary";
Résultat :
+-----------+--------+ | Character | Binary | +-----------+--------+ | 3 | 0 | +-----------+--------+
Ici, j'ai cherché un c
minuscule au lieu d'une majuscule, et le BINARY
la chaîne ne correspondait pas.
Arguments nuls
Passer null
car tout argument donne null
:
SELECT
REGEXP_INSTR(null, 'c') AS "1",
REGEXP_INSTR('Cat', null) AS "2",
REGEXP_INSTR(null, null) AS "3";
Résultat :
+------+------+------+ | 1 | 2 | 3 | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Mauvais nombre d'arguments
Passer le mauvais nombre d'arguments ou aucun argument, entraîne une erreur :
SELECT REGEXP_INSTR('Cat');
Résultat :
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_INSTR'