V MySQL je to REGEXP
operátor se používá k určení, zda řetězec odpovídá regulárnímu výrazu. Je to synonymum pro REGEXP_LIKE()
.
Pokud řetězec odpovídá zadanému regulárnímu výrazu, výsledek je 1
, jinak je to 0
.
Syntaxe
Syntaxe vypadá takto:
expr REGEXP pat
Kde expr
je vstupní řetězec a pat
je regulární výraz, proti kterému testujete řetězec.
Příklad 1 – Základní regulární výraz
Nejzákladnější regulární výraz, který můžeme použít, je ten, který nemá žádné speciální znaky. Zde použijeme pouze řetězec. Pokud se jakákoli část vstupního řetězce shoduje s tímto řetězcem, vrátí shodu.
SELECT 'Kukuřice' REGEXP 'Kukuřice' AS 'Kukuřice', 'Žalud' REGEXP 'Kukuřice' JAKO 'Žalud', 'Kouh' REGEXP 'Kukuřice' AS 'Kouh', 'Sýr' REGEXP 'Kukuřice' JAKO 'Sýr ';
Výsledek:
+------+-------+--------+--------+| Kukuřice | Žalud | Roh | Sýr |+------+-------+--------+--------+| 1 | 1 | 1 | 0 |+------+-------+--------+--------+
Příklad 2 – Porovnejte začátek řetězce
V tomto příkladu regulární výraz určuje, že řetězec musí začínat Co
.
SELECT 'Corn' REGEXP '^Co' AS 'Corn', 'Acorn' REGEXP '^Co' AS 'Acorn', 'Cheese' REGEXP '^Co' AS 'Sýr';
Výsledek:
+------+-------+--------+| Kukuřice | Žalud | Sýr |+------+-------+--------+| 1 | 0 | 0 |+------+-------+--------+
Příklad 3 – Spojte konec řetězce
V tomto příkladu regulární výraz určuje, že řetězec musí končit rn
.
VYBERTE 'Kukuřice' REGEXP 'rn$' AS 'Kukuřice', 'Žalud' REGEXP 'rn$' AS 'Žalud', 'Sýr' REGEXP 'rn$' AS 'Sýr';
Výsledek:
+------+-------+--------+| Kukuřice | Žalud | Sýr |+------+-------+--------+| 1 | 1 | 0 |+------+-------+--------+
Příklad 4 – Shoda s libovolným znakem
.
znak odpovídá libovolnému znaku.
SELECT 'Corn' REGEXP'.' JAKO 'Kukuřice', 'Sýr' REGEXP '.' JAKO 'Sýr', '' REGEXP '.' AS '';
Výsledek:
+------+--------+---+| Kukuřice | Sýr | |+------+--------+---+| 1 | 1 | 0 |+------+--------+---+
Tento znak se obvykle používá ve spojení s jinými znaky k určení dalších kritérií. Například:
SELECT 'Corn' REGEXP '^C.rn$' AS 'Corn', 'Crn' REGEXP '^C.rn$' AS 'Crn';
Výsledek:
+------+-----+| Kukuřice | Crn |+------+-----+| 1 | 0 |+------+-----+
Zde určíme, že řetězec musí začínat C
, že za ním musí následovat znak (jakýkoli znak) a že musí končit rn
.
Všimněte si, že tento znak určuje jednu instanci znaku. Pokud chcete zadat více instancí (například ee
místo pouhého e
), budete muset přidat další .
znaky.
VYBERTE 'Tweet' REGEXP '^Tw..t$' AS 'Tweet', 'Tweat' REGEXP '^Tw..t$' AS 'Tweat', 'Tweet' REGEXP '^Tw.t$' AS 'Tweet', 'Twit' REGEXP '^Tw..t$' AS 'Twit';
Výsledek:
+-------+-------+-------+------+| Tweet | Tweat | Tweet | Twit |+-------+-------+-------+------+| 1 | 1 | 0 | 0 |+-------+-------+-------+------+
Dalším způsobem, jak toho dosáhnout, je zadat počet výskytů ve složených závorkách:
VYBERTE 'Tweet' REGEXP '^Tw.{2}t$' JAKO 'Tweet', 'Tweat' REGEXP '^Tw.{2}t$' JAKO 'Tweat', 'Tweet' REGEXP '^Tw. {1}t$' AS 'Tweet', 'Twit' REGEXP '^Tw.{2}t$' AS 'Twit';
Výsledek:
+-------+-------+-------+------+| Tweet | Tweat | Tweet | Twit |+-------+-------+-------+------+| 1 | 1 | 0 | 0 |+-------+-------+-------+------+
Pokud však znáte znak, který hledáte, můžete jej zadat (místo .
znak), jak ukazuje následující příklad.
Příklad 5 – Shoda nula nebo více instancí konkrétní postavy
Pro specifikaci nula nebo více instancí e
můžeme provést následující postava:
SELECT 'Twet' REGEXP '^Twe*t$' AS 'Twet', 'Tweet' REGEXP '^Twe*t$' AS 'Tweet', 'Tweeet' REGEXP '^Twe*t$' AS 'Tweeet ', 'Twt' REGEXP '^Twe*t$' JAKO 'Twt', 'Twit' REGEXP '^Twe*t$' JAKO 'Twit', 'Twiet' REGEXP '^Twe*t$' JAKO 'Twiet', 'Tweit' REGEXP '^Twe*t$' AS 'Tweit';
Výsledek:
+------+-------+--------+-----+------+-------+- ------+| Tweet | Tweet | Tweet | Twt | Twit | Twiet | Tweit |+------+-------+--------+-----+------+-------+-- -----+| 1 | 1 | 1 | 1 | 0 | 0 | 0 |+------+-------+--------+-----+------+-------+-- -----+
První čtyři se shodují, ale poslední tři nikoli.
Příklad 6 – Porovnejte jednu nebo více instancí konkrétní postavy
Předchozí příklad můžeme upravit tak, že dostaneme shodu pouze pokud jeden nebo bylo nalezeno více znaků (předchozí příklad vrátil shodu, pokud nula nebo jich bylo nalezeno více). K tomu jednoduše použijeme +
místo *
:
VYBERTE 'Twet' REGEXP '^Twe+t$' JAKO 'Twet', 'Tweet' REGEXP '^Twe+t$' JAKO 'Tweet', 'Tweeet' REGEXP '^Twe+t$' JAKO 'Tweet ', 'Twt' REGEXP '^Twe+t$' JAKO 'Twt', 'Twit' REGEXP '^Twe+t$' JAKO 'Twit', 'Twiet' REGEXP '^Twe+t$' JAKO 'Twiet', 'Tweit' REGEXP '^Twe+t$' AS 'Tweit';
Výsledek:
+------+-------+--------+-----+------+-------+- ------+| Tweet | Tweet | Tweet | Twt | Twit | Twiet | Tweit |+------+-------+--------+-----+------+-------+-- -----+| 1 | 1 | 1 | 0 | 0 | 0 | 0 |+------+-------+--------+-----+------+-------+-- -----+
V tomto případě čtvrté slovo vrátí výsledek odlišný od předchozího příkladu.
Příklad 7 – Shoda nuly nebo jedné instance konkrétní postavy
Předchozí příklad můžeme upravit tak, že získáme shodu pouze na nule nebo na jednom z požadovaných znaků. K tomu používáme ?
:
SELECT 'Twet' REGEXP '^Twe?t$' AS 'Twet', 'Tweet' REGEXP '^Twe?t$' AS 'Tweet', 'Tweeet' REGEXP '^Twe?t$' AS 'Tweeet ', 'Twt' REGEXP '^Twe?t$' JAKO 'Twt', 'Twit' REGEXP '^Twe?t$' JAKO 'Twit', 'Twiet' REGEXP '^Twe?t$' JAKO 'Twiet', 'Tweit' REGEXP '^Twe?t$' AS 'Tweit';
Výsledek:
+------+-------+--------+-----+------+-------+- ------+| Tweet | Tweet | Tweet | Twt | Twit | Twiet | Tweit |+------+-------+--------+-----+------+-------+-- -----+| 1 | 0 | 0 | 1 | 0 | 0 | 0 |+------+-------+--------+-----+------+-------+-- -----+
Příklad 8 – Střídání
Můžete použít |
znak, který odpovídá jedné nebo jiné sekvenci znaků:
SELECT 'Tweet' REGEXP 'Tw|et' AS 'Tweet', 'For Let' REGEXP 'Tw|et' AS 'For Let', 'Banana' REGEXP 'Tw|et' AS 'Banana';Výsledek:
+-------+---------+--------+| Tweet | Pro Let | Banán |+-------+---------+--------+| 1 | 1 | 0 |+-------+---------+--------+Zde je další příklad, kde hledám celá slova:
VYBERTE 'Kočka' REGEXP 'Kočka|Pes' JAKO 'Kočka', 'Pes' REGEXP 'Kočka|Pes' JAKO 'Pes', 'Doggone' REGEXP 'Kočka|Pes' JAKO 'Pejsek', 'Banán' REGEXP 'Kočka|Pes' JAKO 'Banán';Výsledek:
+-----+-----+---------+--------+| Kočka | Pes | Doggone | Banán |+-----+-----+---------+--------+| 1 | 1 | 1 | 0 |+-----+-----+---------+--------+Stále získáme shodu, i když se náš regulární výraz shoduje pouze s částí řetězce.
Příklad 9 – Shoda s nulou nebo více instancemi sekvence
Můžete použít závorky spolu s hvězdičkou
()*
pro určení nula nebo více instancí sekvence:SELECT 'Banán' REGEXP '(an)*' AS 'Banán', 'Land' REGEXP '(an)*' AS 'Land', 'Sýr' REGEXP '(an)*' AS 'Sýr';Výsledek:
+--------+------+--------+| Banán | Pozemek | Sýr |+--------+------+--------+| 1 | 1 | 1 |+--------+------+--------+Další příklad:
SELECT 'Banana' REGEXP '^B(an)*d$' AS 'Banana', 'Band' REGEXP '^B(an)*d$' AS 'Band', 'Lid' REGEXP '^B( an)*d$' AS 'Bad', 'Špatný' REGEXP '^B(an)*d$' AS 'Špatný';Výsledek:
+--------+------+------+-----+| Banán | Kapela | Plešatý | Špatné |+--------+------+------+-----+| 0 | 1 | 0 | 0 |+--------+------+------+-----+Příklad 10 – Opakování
Jak je vidět v předchozím příkladu, k určení opakování můžete použít složené závorky. Tento zápis poskytuje obecnější způsob psaní regulárních výrazů než některé z předchozích příkladů:
VYBERTE 'Tweet' REGEXP 'e{3}' JAKO 'Tweet', 'Tweet' REGEXP 'e{3}' JAKO 'Tweet';Výsledek:
+--------+-------+| Tweet | Tweet |+---------+-------+| 1 | 0 |+--------+-------+Příklad 11 – Rozsah
K určení rozsahu můžete použít znak pomlčky. Zde je příklad, který specifikuje rozsah čísel:
VYBERTE 'Tweet 123' REGEXP '[0-9]' JAKO 'Tweet 123', 'Tweet ABC' REGEXP '[0-9]' JAKO 'Tweet ABC';Výsledek:
+--------+-------+| Tweet | Tweet |+---------+-------+| 1 | 0 |+--------+-------+A následující příklad specifikuje rozsah písmen:
SELECT 'Tweet 123' REGEXP '[A-Z]' AS 'Tweet 123', 'ABC' REGEXP '[A-Z]' AS 'ABC', '123' REGEXP '[A-Z]' AS '123';Výsledek:
+--------+-------+| Tweet | Tweet |+---------+-------+| 1 | 0 |+--------+-------+Pokud omezíme rozsah čísel, stane se toto:
SELECT '123' REGEXP '[1-3]' AS '123', '012' REGEXP '[1-3]' AS '012', '045' REGEXP '[1-3]' AS '045 ';Výsledek:
+-----+-----+-----+| 123 | 012 | 045 |+-----+-----+-----+| 1 | 1 | 0 |+-----+-----+-----+Příklad 12 – Není v rozsahu
Můžeme použít
^
znak pro úpravu předchozího příkladu tak, aby byl vyloučen zadaný rozsah znaků:SELECT '123' REGEXP '[^1-3]' AS '123', '012' REGEXP '[^1-3]' AS '012', '045' REGEXP '[^1-3]' AS '045';Výsledek:
+-----+-----+-----+| 123 | 012 | 045 |+-----+-----+-----+| 0 | 1 | 1 |+-----+-----+-----+Dostaneme tedy opačný výsledek než v předchozím příkladu.