En MariaDB, el REGEXP_INSTR()
La función devuelve el índice inicial de una subcadena que coincide con el patrón de expresión regular.
El índice comienza en 1
. Si no hay ninguna coincidencia, el resultado es 0
.
Sintaxis
La sintaxis es así:
REGEXP_INSTR(subject, pattern)
Donde subject
es la cadena de entrada y pattern
es el patrón de expresión regular para la subcadena.
Tenga en cuenta que, en el momento de escribir este artículo, la versión de MariaDB de REGEXP_INSTR()
acepta menos argumentos que REGEXP_INSTR()
de MySQL . La versión de MySQL le permite proporcionar argumentos para la posición inicial de la búsqueda, qué ocurrencia buscar, qué tipo de posición devolver, así como una forma de refinar la expresión regular.
Ejemplo
He aquí un ejemplo básico:
SELECT REGEXP_INSTR('Cat', 'at');
Resultado:
+---------------------------+ | REGEXP_INSTR('Cat', 'at') | +---------------------------+ | 2 | +---------------------------+
En este caso, hay una coincidencia y la subcadena comienza en la posición 2.
Sin coincidencia
Aquí hay un ejemplo donde no hay coincidencia:
SELECT REGEXP_INSTR('Cat', '^at');
Resultado:
+----------------------------+ | REGEXP_INSTR('Cat', '^at') | +----------------------------+ | 0 | +----------------------------+
No hay ninguna coincidencia, por lo que el resultado es 0
. No hay coincidencia porque especifiqué que la cadena debe comenzar con la subcadena.
Vamos a cambiarlo para que lo haga comienza con esa subcadena:
SELECT REGEXP_INSTR('at', '^at');
Resultado:
+---------------------------+ | REGEXP_INSTR('at', '^at') | +---------------------------+ | 1 | +---------------------------+
Sensibilidad de mayúsculas y minúsculas
El REGEXP_INSTR()
La función sigue las reglas de distinción entre mayúsculas y minúsculas de la intercalación efectiva. La coincidencia se realiza sin distinción entre mayúsculas y minúsculas para intercalaciones que no distinguen entre mayúsculas y minúsculas, y entre mayúsculas y minúsculas para intercalaciones que distinguen entre mayúsculas y minúsculas y para datos binarios.
He aquí un ejemplo:
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";
Resultado:
+------------+------------------+----------------+ | My Default | Case Insensitive | Case Sensitive | +------------+------------------+----------------+ | 1 | 1 | 0 | +------------+------------------+----------------+
Mi intercalación predeterminada no distingue entre mayúsculas y minúsculas. Las otras dos cadenas se forzaron a una intercalación que no distingue entre mayúsculas y minúsculas y una intercalación que distingue entre mayúsculas y minúsculas, respectivamente.
Proporcionar un BINARY
la cadena también distingue entre mayúsculas y minúsculas (ver más abajo).
Cadenas binarias
De forma predeterminada, las posiciones se miden en caracteres en lugar de bytes. Sin embargo, puede convertir un juego de caracteres multibyte a BINARY
para obtener compensaciones en bytes si es necesario.
Ejemplo:
SELECT
REGEXP_INSTR('© Cat', 'C') AS "Character",
REGEXP_INSTR(BINARY '© Cat', 'C') AS "Binary";
Resultado:
+-----------+--------+ | Character | Binary | +-----------+--------+ | 3 | 4 | +-----------+--------+
El símbolo de copyright usa dos bytes y, por lo tanto, en este ejemplo obtenemos un resultado de 4
al convertirlo a BINARY
, en comparación con 3
que obtenemos de otra manera.
Aunque tenga en cuenta que pasar un BINARY
string también afecta la distinción entre mayúsculas y minúsculas. Con BINARY
cadenas, un carácter en mayúscula es diferente a su equivalente en minúscula:
SELECT
REGEXP_INSTR('© Cat', 'c') AS "Character",
REGEXP_INSTR(BINARY '© Cat', 'c') AS "Binary";
Resultado:
+-----------+--------+ | Character | Binary | +-----------+--------+ | 3 | 0 | +-----------+--------+
Aquí, busqué una minúscula c
en lugar de mayúsculas, y BINARY
la cadena no coincide.
Argumentos nulos
Pasando null
ya que cualquier argumento da como resultado null
:
SELECT
REGEXP_INSTR(null, 'c') AS "1",
REGEXP_INSTR('Cat', null) AS "2",
REGEXP_INSTR(null, null) AS "3";
Resultado:
+------+------+------+ | 1 | 2 | 3 | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Número incorrecto de argumentos
Pasar el número incorrecto de argumentos o ningún argumento da como resultado un error:
SELECT REGEXP_INSTR('Cat');
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_INSTR'