V MariaDB, REGEXP_INSTR()
funkce vrací počáteční index podřetězce, který odpovídá vzoru regulárního výrazu.
Index začíná na 1
. Pokud není shoda, výsledek je 0
.
Syntaxe
Syntaxe vypadá takto:
REGEXP_INSTR(subject, pattern)
Kde subject
je vstupní řetězec a pattern
je vzor regulárního výrazu pro podřetězec.
Všimněte si, že v době psaní tohoto článku byla MariaDB verze REGEXP_INSTR()
přijímá méně argumentů než REGEXP_INSTR()
MySQL . Verze MySQL vám umožňuje poskytnout argumenty pro počáteční pozici vyhledávání, který výskyt hledat, jaký typ pozice vrátit, stejně jako způsob, jak upřesnit regulární výraz.
Příklad
Zde je základní příklad:
SELECT REGEXP_INSTR('Cat', 'at');
Výsledek:
+---------------------------+ | REGEXP_INSTR('Cat', 'at') | +---------------------------+ | 2 | +---------------------------+
V tomto případě existuje shoda a podřetězec začíná na pozici 2.
Žádná shoda
Zde je příklad, kdy neexistuje žádná shoda:
SELECT REGEXP_INSTR('Cat', '^at');
Výsledek:
+----------------------------+ | REGEXP_INSTR('Cat', '^at') | +----------------------------+ | 0 | +----------------------------+
Neexistuje žádná shoda, takže výsledek je 0
. Neexistuje žádná shoda, protože jsem zadal, že řetězec musí začínat podřetězcem.
Pojďme to změnit tak, aby to dělalo začněte tímto podřetězcem:
SELECT REGEXP_INSTR('at', '^at');
Výsledek:
+---------------------------+ | REGEXP_INSTR('at', '^at') | +---------------------------+ | 1 | +---------------------------+
Rozlišovat malá a velká písmena
REGEXP_INSTR()
funkce se řídí pravidly rozlišování malých a velkých písmen efektivního řazení. Párování se provádí bez rozlišení malých a velkých písmen u porovnávání bez rozlišení malých a velkých písmen a u porovnávání rozlišujících malá a velká písmena a u binárních dat.
Zde je příklad:
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";
Výsledek:
+------------+------------------+----------------+ | My Default | Case Insensitive | Case Sensitive | +------------+------------------+----------------+ | 1 | 1 | 0 | +------------+------------------+----------------+
Moje výchozí řazení nerozlišuje malá a velká písmena. Zbývající dva řetězce byly nuceny používat řazení bez rozlišení malých a velkých písmen, respektive řazení rozlišující malá a velká písmena.
Poskytování BINARY
řetězec také rozlišuje velká a malá písmena (viz níže).
Binární řetězce
Ve výchozím nastavení se pozice měří spíše ve znacích než v bajtech. Můžete však přetypovat vícebajtovou znakovou sadu na BINARY
pro získání offsetů v bajtech, pokud potřebujete.
Příklad:
SELECT
REGEXP_INSTR('© Cat', 'C') AS "Character",
REGEXP_INSTR(BINARY '© Cat', 'C') AS "Binary";
Výsledek:
+-----------+--------+ | Character | Binary | +-----------+--------+ | 3 | 4 | +-----------+--------+
Symbol autorských práv používá dva bajty, a proto v tomto příkladu dostaneme výsledek 4
při odesílání do BINARY
, ve srovnání s 3
které dostaneme jinak.
Ačkoli mějte na paměti, že předávání BINARY
řetězec také ovlivňuje citlivost. S BINARY
řetězce, velký znak se liší od malého protějšku:
SELECT
REGEXP_INSTR('© Cat', 'c') AS "Character",
REGEXP_INSTR(BINARY '© Cat', 'c') AS "Binary";
Výsledek:
+-----------+--------+ | Character | Binary | +-----------+--------+ | 3 | 0 | +-----------+--------+
Zde jsem hledal malé písmeno c
místo velkých písmen a BINARY
řetězec se neshodoval.
Nulové argumenty
Předávání null
protože jakýkoli argument má za následek null
:
SELECT
REGEXP_INSTR(null, 'c') AS "1",
REGEXP_INSTR('Cat', null) AS "2",
REGEXP_INSTR(null, null) AS "3";
Výsledek:
+------+------+------+ | 1 | 2 | 3 | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Špatný počet argumentů
Předání nesprávného počtu argumentů nebo žádné argumenty vede k chybě:
SELECT REGEXP_INSTR('Cat');
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_INSTR'