sql >> Base de Datos >  >> RDS >> MariaDB

Cómo funciona REGEXP_INSTR() en MariaDB

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'