sql >> Databáze >  >> RDS >> MariaDB

Jak REGEXP funguje v MariaDB

V MariaDB, REGEXP operátor se používá k určení, zda řetězec odpovídá regulárnímu výrazu.

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, pro který řetězec testujete.

Příklady

Níže jsou uvedeny příklady použití REGEXP operátor s různými vzory.

Základní regulární výraz

Začněme tím nejjednodušším příkladem. Nejjednodušší regulární výraz, který můžeme použít, je ten, který neobsahuje žá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 
  'Corn' REGEXP 'Corn' AS "Corn",
  'Acorn' REGEXP 'Corn' AS "Acorn",
  'Corner' REGEXP 'Corn' AS "Corner",
  'Cheese' REGEXP 'Corn' AS "Cheese";

Výsledek:

+------+-------+--------+--------+
| Corn | Acorn | Corner | Cheese |
+------+-------+--------+--------+
|    1 |     1 |      1 |      0 |
+------+-------+--------+--------+

Shodovat se se začátkem ř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 "Cheese";

Výsledek:

+------+-------+--------+
| Corn | Acorn | Cheese |
+------+-------+--------+
|    1 |     0 |      0 |
+------+-------+--------+

Přizpůsobit konec řetězce

V tomto příkladu regulární výraz určuje, že řetězec musí končit rn .

SELECT 
  'Corn' REGEXP 'rn$' AS "Corn",
  'Acorn' REGEXP 'rn$' AS "Acorn",
  'Cheese' REGEXP 'rn$' AS "Cheese";

Výsledek:

+------+-------+--------+
| Corn | Acorn | Cheese |
+------+-------+--------+
|    1 |     1 |      0 |
+------+-------+--------+

Odpovídají libovolnému znaku

. znak odpovídá libovolnému znaku.

SELECT 
  'Corn' REGEXP '.' AS "Corn",
  'Cheese' REGEXP '.' AS "Cheese",
  '' REGEXP '.' AS "";

Výsledek:

+------+--------+---+
| Corn | Cheese |   |
+------+--------+---+
|    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:

+------+-----+
| Corn | 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.

SELECT 
  '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:

SELECT 
  'Tweet' REGEXP '^Tw.{2}t$' AS "Tweet", 
  'Tweat' REGEXP '^Tw.{2}t$' AS "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.

Odpovídají nule nebo více instancím 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$' AS "Twt",
  'Twit' REGEXP '^Twe*t$' AS "Twit",
  'Twiet' REGEXP '^Twe*t$' AS "Twiet",
  'Tweit' REGEXP '^Twe*t$' AS "Tweit";

Výsledek:

+------+-------+--------+-----+------+-------+-------+
| Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit |
+------+-------+--------+-----+------+-------+-------+
|    1 |     1 |      1 |   1 |    0 |     0 |     0 |
+------+-------+--------+-----+------+-------+-------+

První čtyři se shodují, ale poslední tři nikoli.

Shodujte se s jednou nebo více instancemi 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 * :

SELECT 
  'Twet' REGEXP '^Twe+t$' AS "Twet",
  'Tweet' REGEXP '^Twe+t$' AS "Tweet",
  'Tweeet' REGEXP '^Twe+t$' AS "Tweeet",
  'Twt' REGEXP '^Twe+t$' AS "Twt",
  'Twit' REGEXP '^Twe+t$' AS "Twit",
  'Twiet' REGEXP '^Twe+t$' AS "Twiet",
  'Tweit' REGEXP '^Twe+t$' AS "Tweit";

Výsledek:

+------+-------+--------+-----+------+-------+-------+
| Twet | Tweet | Tweeet | 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.

Odpovídá nule nebo jedné instanci 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$' AS "Twt",
  'Twit' REGEXP '^Twe?t$' AS "Twit",
  'Twiet' REGEXP '^Twe?t$' AS "Twiet",
  'Tweit' REGEXP '^Twe?t$' AS "Tweit";

Výsledek:

+------+-------+--------+-----+------+-------+-------+
| Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit |
+------+-------+--------+-----+------+-------+-------+
|    1 |     0 |      0 |   1 |    0 |     0 |     0 |
+------+-------+--------+-----+------+-------+-------+

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 | For Let | Banana |
+-------+---------+--------+
|     1 |       1 |      0 |
+-------+---------+--------+

Zde je další příklad, kde hledám celá slova:

SELECT 
  'Cat' REGEXP 'Cat|Dog' AS "Cat",
  'Dog' REGEXP 'Cat|Dog' AS "Dog",
  'Doggone' REGEXP 'Cat|Dog' AS "Doggone",
  'Banana' REGEXP 'Cat|Dog' AS "Banana";

Výsledek:

+-----+-----+---------+--------+
| Cat | Dog | Doggone | Banana |
+-----+-----+---------+--------+
|   1 |   1 |       1 |      0 |
+-----+-----+---------+--------+

Stále získáme shodu, i když se náš regulární výraz shoduje pouze s částí řetězce.

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 
  'Banana' REGEXP '(an)*' AS "Banana",
  'Land' REGEXP '(an)*' AS "Land",
  'Cheese' REGEXP '(an)*' AS "Cheese";

Výsledek:

+--------+------+--------+
| Banana | Land | Cheese |
+--------+------+--------+
|      1 |    1 |      1 |
+--------+------+--------+

Další příklad:

SELECT 
  'Banana' REGEXP '^B(an)*d$' AS "Banana",
  'Band' REGEXP '^B(an)*d$' AS "Band",
  'Bald' REGEXP '^B(an)*d$' AS "Bald",
  'Bad' REGEXP '^B(an)*d$' AS "Bad";

Výsledek:

+--------+------+------+-----+
| Banana | Band | Bald | Bad |
+--------+------+------+-----+
|      0 |    1 |    0 |   0 |
+--------+------+------+-----+

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ů:

SELECT 
  'Tweeet' REGEXP 'e{3}' AS "Tweeet",
  'Tweet' REGEXP 'e{3}' AS "Tweet";

Výsledek:

+--------+-------+
| Tweeet | Tweet |
+--------+-------+
|      1 |     0 |
+--------+-------+

Rozsah

K určení rozsahu můžete použít znak pomlčky. Zde je příklad, který specifikuje rozsah čísel:

SELECT 
  'Tweet 123' REGEXP '[0-9]' AS "Tweet 123",
  'Tweet ABC' REGEXP '[0-9]' AS "Tweet ABC";

Výsledek:

+--------+-------+
| Tweeet | 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 123 | ABC | 123 |
+-----------+-----+-----+
|         1 |   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 |
+-----+-----+-----+

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 |
+-----+-----+-----+

V tomto případě dostaneme opačný výsledek než v předchozím příkladu.

Nulové hodnoty

Pokud je výraz nebo vzor null , výsledkem je null :

SELECT 
  null REGEXP 'Corn' AS "Corn",
  'Acorn' REGEXP null AS "Acorn",
  null REGEXP null AS "Corner";

Výsledek:

+------+-------+--------+
| Corn | Acorn | Corner |
+------+-------+--------+
| NULL |  NULL |   NULL |
+------+-------+--------+

  1. mysql název pole z proměnné

  2. PostgreSQL sloupec foo neexistuje, kde foo je hodnota

  3. SQL SERVER:Získejte celkový počet dní mezi dvěma daty

  4. Jak přidat nový sloupec do tabulky MYSQL?