sql >> Databasteknik >  >> RDS >> MariaDB

Hur REGEXP_INSTR() fungerar i MariaDB

I MariaDB, REGEXP_INSTR() funktion returnerar startindexet för en delsträng som matchar det reguljära uttrycksmönstret.

Indexet börjar vid 1 . Om det inte finns någon matchning är resultatet 0 .

Syntax

Syntaxen ser ut så här:

REGEXP_INSTR(subject, pattern)

Där subject är inmatningssträngen och pattern är det reguljära uttrycksmönstret för delsträngen.

Observera att i skrivande stund MariaDB:s version av REGEXP_INSTR() accepterar färre argument än MySQL:s REGEXP_INSTR() . MySQL:s version låter dig ange argument för sökningens startposition, vilken förekomst du ska söka efter, vilken typ av position som ska returneras, samt ett sätt att förfina det reguljära uttrycket.

Exempel

Här är ett grundläggande exempel:

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

Resultat:

+---------------------------+
| REGEXP_INSTR('Cat', 'at') |
+---------------------------+
|                         2 |
+---------------------------+

I det här fallet finns det en matchning och delsträngen börjar vid position 2.

Ingen match

Här är ett exempel där det inte finns någon matchning:

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

Resultat:

+----------------------------+
| REGEXP_INSTR('Cat', '^at') |
+----------------------------+
|                          0 |
+----------------------------+

Det finns ingen matchning, så resultatet är 0 . Det finns ingen matchning eftersom jag angav att strängen måste börja med understrängen.

Låt oss ändra det så att det gör det börja med den delsträngen:

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

Resultat:

+---------------------------+
| REGEXP_INSTR('at', '^at') |
+---------------------------+
|                         1 |
+---------------------------+

Skaftkänslighet

REGEXP_INSTR() funktionen följer reglerna för skiftlägeskänslighet för den effektiva sorteringen. Matchning utförs skiftlägesokänsligt för skiftlägesokänsliga sorteringar och skiftlägeskänsliga för skiftlägeskänsliga sorteringar och för binära data.

Här är ett exempel:

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

Resultat:

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

Min standardsortering är skiftlägesokänslig. De andra två strängarna tvingades till en skiftlägesokänslig sortering respektive skiftlägeskänslig.

Tillhandahålla en BINARY sträng är också skiftlägeskänslig (se nedan).

Binära strängar

Som standard mäts positionerna i tecken snarare än byte. Däremot kan du casta en multi-byte teckenuppsättning till BINARY för att få offset i byte om du behöver.

Exempel:

SELECT 
    REGEXP_INSTR('© Cat', 'C') AS "Character",
    REGEXP_INSTR(BINARY '© Cat', 'C') AS "Binary";

Resultat:

+-----------+--------+
| Character | Binary |
+-----------+--------+
|         3 |      4 |
+-----------+--------+

Upphovsrättssymbolen använder två byte, och därför får vi i detta exempel resultatet 4 när du castar den till BINARY , jämfört med 3 att vi får annat.

Observera dock att skicka en BINARY sträng påverkar också skiftlägeskänsligheten. Med BINARY strängar, skiljer sig ett versaltecken från dess motsvarighet till gemener:

SELECT 
    REGEXP_INSTR('© Cat', 'c') AS "Character",
    REGEXP_INSTR(BINARY '© Cat', 'c') AS "Binary";

Resultat:

+-----------+--------+
| Character | Binary |
+-----------+--------+
|         3 |      0 |
+-----------+--------+

Här sökte jag efter en gemen c istället för en versal, och BINARY strängen matchade inte.

Nollargument

Skickar null eftersom alla argument resulterar i null :

SELECT 
    REGEXP_INSTR(null, 'c') AS "1",
    REGEXP_INSTR('Cat', null) AS "2",
    REGEXP_INSTR(null, null) AS "3";

Resultat:

+------+------+------+
| 1    | 2    | 3    |
+------+------+------+
| NULL | NULL | NULL |
+------+------+------+

Fel antal argument

Om du skickar fel antal argument eller inga argument, resulterar det i ett fel:

SELECT REGEXP_INSTR('Cat');

Resultat:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_INSTR'

  1. SQL Server 2014:Native backup-kryptering

  2. Automatiserad testning av uppgraderingsprocessen för PXC/MariaDB Galera Cluster

  3. Hur MONTHNAME() fungerar i MariaDB

  4. Ansluter till MySQL med Python