sql >> Database >  >> RDS >> Mysql

Hoe de REGEXP_INSTR()-functie werkt in MySQL

In MySQL is de REGEXP_INSTR() functie retourneert de startindex van een subtekenreeks die overeenkomt met het patroon van de reguliere expressie.

De index begint bij 1 . Als er geen overeenkomst is, is het resultaat 0 .

Syntaxis

De syntaxis gaat als volgt:

REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])

Waar expr is de invoerreeks en pat is het reguliere expressiepatroon voor de subtekenreeks.

De optionele pos argument stelt u in staat om een ​​positie in de tekenreeks op te geven om de zoekopdracht te starten. Indien weggelaten, begint het op positie 1.

Het optionele occurrence argument stelt u in staat om te specificeren naar welk exemplaar van de overeenkomst moet worden gezocht. Indien weggelaten, wordt de eerste instantie gebruikt (gebeurtenis 1).

De optionele return_option argument kunt u specificeren welk type positie moet worden geretourneerd. Als u 0 . gebruikt , retourneert het de positie van het eerste teken in de overeenkomende subtekenreeks. Als u 1 . gebruikt het geeft de positie terug van het eerste teken volgende de overeenkomende subtekenreeks. Indien weggelaten, is de waarde 0 .

Het optionele match_type argument kunt u de reguliere expressie verfijnen. U kunt dit argument bijvoorbeeld gebruiken om hoofdlettergevoelige overeenkomsten op te geven of niet.

Voorbeeld 1 – Basisgebruik

Hier is een eenvoudig voorbeeld:

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

Resultaat:

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

In dit geval is er een match en begint de substring op positie 2.

Voorbeeld 2 – Geen overeenkomst

Hier is een voorbeeld waarbij er geen overeenkomst is:

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

Resultaat:

+--------+
| Result |
+--------+
|      0 |
+--------+

Er is geen overeenkomst, dus het resultaat is 0 . Er is geen overeenkomst omdat ik heb opgegeven dat de tekenreeks moet beginnen met de subtekenreeks.

Laten we het veranderen zodat het doet begin met die substring:

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

Resultaat:

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

Voorbeeld 3 – De pos Argument

Hier is een voorbeeld van het specificeren van een startpositie:

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

Resultaat:

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

We krijgen dus de index van het tweede voorkomen.

Merk op dat de index nog steeds begint te tellen vanaf positie 1, ongeacht waar u de startpositie opgeeft.

Het volgende voorbeeld toont dit duidelijker aan:

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';

Resultaat:

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

Afhankelijk van je regex-patroon kan dit natuurlijk de index van totaal verschillende substrings retourneren. Voorbeeld:

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';

Resultaat:

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

We kunnen de substrings controleren met de REGEXP_SUBSTR() functie:

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';

Resultaat:

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

Voorbeeld 4 – Het occurrence Argument

Hier is een voorbeeld van het gebruik van de occurrence argument. In alle gevallen beginnen we op positie 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';

Resultaat:

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

Als we echter op een andere positie beginnen, is het resultaat anders:

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';

Resultaat:

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

Dit gebeurde omdat onze startpositie kwam nadat het eerste voorval was begonnen. Daarom werd voorval 2 voorval 1 en voorval 3 werd voorval 2. En omdat er geen voorvallen meer waren, was het resultaat van voorval 3 negatief (d.w.z. er was geen voorval 3).

Voorbeeld 5 – De return_option Argument

Hier is een voorbeeld van het gebruik van de return_option argument:

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';

Resultaat:

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

Optie 0 retourneerde het eerste teken van de overeenkomende subtekenreeks. Optie 1 retourneerde de positie na de overeenkomende subtekenreeks.

Zo ziet het eruit als we het toepassen op het vorige voorbeeld:

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);

Resultaat:

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

In dit geval hebben we een set gemaakt met optie 0, en een andere met optie 1, en ze vervolgens samengevoegd met UNION ALL .

Voorbeeld 6 – Het match_type Argument

U kunt een extra argument opgeven om het zoektype te bepalen. Hiermee kunt u dingen specificeren zoals of de overeenkomst hoofdlettergevoelig is, of u lijnafsluitingen wilt opnemen, enz.

Hier is een voorbeeld van het specificeren van een hoofdlettergevoelige overeenkomst en een hoofdletterongevoelige overeenkomst:

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';

Resultaat:

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

Het match_type argument kan de volgende tekens bevatten:

c
Hoofdlettergevoelige overeenkomst.
i
Hoofdletterongevoelige overeenkomst.
m
Modus met meerdere regels. Herken lijnafsluitingen binnen de string. Het standaardgedrag is om regelafsluitingen alleen aan het begin en einde van de tekenreeksuitdrukking te laten overeenkomen.
n
De . karakter komt overeen met regelafsluitingen. De standaard is voor . overeenkomend om te stoppen aan het einde van een regel.
u
Alleen Unix regeleindes. Alleen het teken van de nieuwe regel wordt herkend als een regel die eindigt met de . , ^ , en $ match operators.

  1. Voorwaardelijke WHERE-clausule met CASE-instructie in Oracle

  2. MariaDB MaxScale Load Balancing op Docker:implementatie:deel één

  3. Recursieve zoekopdracht in Oracle

  4. Hoe Python met SQL Server te verbinden om het backend-proces te automatiseren