sql >> Base de Datos >  >> RDS >> Mysql

Cómo funciona la función REGEXP_INSTR() en MySQL

En MySQL, 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(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])

Donde expr es la cadena de entrada y pat es el patrón de expresión regular para la subcadena.

El pos opcional El argumento le permite especificar una posición dentro de la cadena para iniciar la búsqueda. Si se omite, comienza en la posición 1.

La occurrence opcional El argumento le permite especificar qué ocurrencia de la coincidencia buscar. Si se omite, se utiliza la primera ocurrencia (ocurrencia 1).

La return_option opcional El argumento le permite especificar qué tipo de posición devolver. Si usa 0 , devolverá la posición del primer carácter en la subcadena coincidente. Si usa 1 devuelve la posición del primer carácter siguiente la subcadena coincidente. Si se omite, el valor es 0 .

El match_type opcional El argumento le permite refinar la expresión regular. Por ejemplo, puede usar este argumento para especificar si distingue entre mayúsculas y minúsculas o no.

Ejemplo 1:uso básico

He aquí un ejemplo básico:

SELECT REGEXP_INSTR('Cat', 'at') Result;

Resultado:

+--------+
| Result |
+--------+
|      2 |
+--------+

En este caso, hay una coincidencia y la subcadena comienza en la posición 2.

Ejemplo 2:Sin coincidencia

Aquí hay un ejemplo donde no hay coincidencia:

SELECT REGEXP_INSTR('Cat', '^at') Result;

Resultado:

+--------+
| Result |
+--------+
|      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') Result;

Resultado:

+--------+
| Result |
+--------+
|      1 |
+--------+

Ejemplo 3:el pos Argumento

Este es un ejemplo de cómo especificar una posición inicial:

SELECT REGEXP_INSTR('Cat Cat', 'Cat', 2) Result;

Resultado:

+--------+
| Result |
+--------+
|      5 |
+--------+

Entonces obtenemos el índice de la segunda ocurrencia.

Tenga en cuenta que el índice aún comienza a contar desde la posición 1, independientemente de dónde especifique la posición inicial.

El siguiente ejemplo demuestra esto más claramente:

SELECT 
  REGEXP_INSTR('Cat Cat', 'Cat', 2) AS 'Pos 2', 
  REGEXP_INSTR('Cat Cat', 'Cat', 3) AS 'Pos 3', 
  REGEXP_INSTR('Cat Cat', 'Cat', 5) AS 'Pos 5';

Resultado:

+-------+-------+-------+
| Pos 2 | Pos 3 | Pos 5 |
+-------+-------+-------+
|     5 |     5 |     5 |
+-------+-------+-------+

Por supuesto, dependiendo de su patrón de expresiones regulares, esto puede devolver el índice de subcadenas completamente diferentes. Ejemplo:

SELECT 
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1) 'Pos 1',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2) 'Pos 2',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 6) 'Pos 6';

Resultado:

+-------+-------+-------+
| Pos 1 | Pos 2 | Pos 6 |
+-------+-------+-------+
|     1 |     5 |    16 |
+-------+-------+-------+

Podemos verificar las subcadenas con REGEXP_SUBSTR() función:

SELECT 
  REGEXP_SUBSTR('Cat City is SO Cute!', 'C.t', 1) 'Pos 1',
  REGEXP_SUBSTR('Cat City is SO Cute!', 'C.t', 2) 'Pos 2',
  REGEXP_SUBSTR('Cat City is SO Cute!', 'C.t', 6) 'Pos 6';

Resultado:

+-------+-------+-------+
| Pos 1 | Pos 2 | Pos 6 |
+-------+-------+-------+
| Cat   | Cit   | Cut   |
+-------+-------+-------+

Ejemplo 4:la occurrence Argumento

Aquí hay un ejemplo del uso de la occurrence argumento. En todos los casos, comenzamos en la posición 1:

SELECT 
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 1) 'Occurrence 1',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 2) 'Occurrence 2',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 3) 'Occurrence 3';

Resultado:

+--------------+--------------+--------------+
| Occurrence 1 | Occurrence 2 | Occurrence 3 |
+--------------+--------------+--------------+
|            1 |            5 |           16 |
+--------------+--------------+--------------+

Sin embargo, si comenzamos en una posición diferente, el resultado es diferente:

SELECT 
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2, 1) 'Occurrence 1',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2, 2) 'Occurrence 2',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2, 3) 'Occurrence 3';

Resultado:

+--------------+--------------+--------------+
| Occurrence 1 | Occurrence 2 | Occurrence 3 |
+--------------+--------------+--------------+
|            5 |           16 |            0 |
+--------------+--------------+--------------+

Esto sucedió porque nuestra posición inicial se produjo después de que comenzara la primera ocurrencia. Por lo tanto, la ocurrencia 2 se convirtió en la ocurrencia 1 y la ocurrencia 3 se convirtió en la ocurrencia 2. Y debido a que no hubo más ocurrencias, el resultado de la ocurrencia 3 fue negativo (es decir, no hubo ocurrencia 3).

Ejemplo 5:la return_option Argumento

Aquí hay un ejemplo del uso de return_option argumento:

SELECT 
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 1, 0) 'Option 0',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 1, 1) 'Option 1';

Resultado:

+----------+----------+
| Option 0 | Option 1 |
+----------+----------+
|        1 |        4 |
+----------+----------+

La opción 0 devolvió el primer carácter de la subcadena coincidente. La opción 1 devolvió la posición que sigue a la subcadena coincidente.

Así es como se ve si lo aplicamos al ejemplo anterior:

SELECT 
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 1, 0) 'Occurrence 1',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 2, 0) 'Occurrence 2',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 3, 0) 'Occurrence 3'
UNION ALL
SELECT
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 1, 1),
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 2, 1),
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 3, 1);

Resultado:

+--------------+--------------+--------------+
| Occurrence 1 | Occurrence 2 | Occurrence 3 |
+--------------+--------------+--------------+
|            1 |            5 |           16 |
|            4 |            8 |           19 |
+--------------+--------------+--------------+

En este caso, hicimos un conjunto usando la opción 0 y otro usando la opción 1, luego los unimos usando UNION ALL .

Ejemplo 6:el match_type Argumento

Puede proporcionar un argumento adicional para determinar el tipo de coincidencia. Esto le permite especificar cosas como si la coincidencia distingue entre mayúsculas y minúsculas o no, si debe incluir o no terminadores de línea, etc.

Este es un ejemplo de cómo especificar una coincidencia que distingue entre mayúsculas y minúsculas y una coincidencia que no distingue entre mayúsculas y minúsculas:

SELECT 
  REGEXP_INSTR('Cat City is SO Cute!', 'c.t', 1, 1, 0, 'c') 'Case-Sensitive',
  REGEXP_INSTR('Cat City is SO Cute!', 'c.t', 1, 1, 0, 'i') 'Case-Insensitive';

Resultado:

+----------------+------------------+
| Case-Sensitive | Case-Insensitive |
+----------------+------------------+
|              0 |                1 |
+----------------+------------------+

El match_type argumento puede contener los siguientes caracteres:

c
Coincidencia sensible a mayúsculas y minúsculas.
i
Coincidencia insensible a mayúsculas y minúsculas.
m
Modo de varias líneas. Reconocer los terminadores de línea dentro de la cadena. El comportamiento predeterminado es hacer coincidir los terminadores de línea solo al principio y al final de la expresión de cadena.
n
El . el carácter coincide con los terminadores de línea. El valor predeterminado es para . coincidencia para detenerse al final de una línea.
u
Finales de línea exclusivos de Unix. Solo el carácter de nueva línea se reconoce como una línea que termina con . , ^ y $ operadores de coincidencia.