Regulární výrazy MYSQL (REGEXP) se syntaxí a příklady

Co jsou regulární výrazy?

Regulární výrazy pomáhají vyhledávat data odpovídající složitým kritériím. Na zástupné znaky jsme se podívali v předchozím tutoriálu. Pokud jste již dříve pracovali se zástupnými znaky, možná se ptáte, proč se učit regulární výrazy, když můžete získat podobné výsledky pomocí zástupných znaků. Protože ve srovnání se zástupnými znaky nám regulární výrazy umožňují vyhledávat data odpovídající ještě složitějšímu kritériu.

Základní syntaxe

Základní syntaxe regulárního výrazu je následující

SELECT statements... WHERE fieldname REGEXP 'pattern';

TADY -

  • “SELECT prohlášení…” je standard příkaz SELECT
  • "KDE název pole" je název sloupce, na kterém má být regulární výraz proveden.
  • "Vzor REGEXP" REGEXP je operátor regulárního výrazu a 'vzor' představuje vzor, ​​kterému má REGEXP odpovídat. RLIKE je synonymum pro REGEXP a dosahuje stejných výsledků jako REGEXP. Aby nedošlo k záměně s operátorem LIKE, to je lepší použít REGEXP namísto.

Podívejme se nyní na praktický příklad -

SELECT * FROM `movies` WHERE `title` REGEXP 'code';

Výše uvedený dotaz hledá všechny názvy filmů, které obsahují kód slova. Nezáleží na tom, zda je „kód“ na začátku, uprostřed nebo na konci titulku. Dokud to bude obsaženo v názvu, bude se to brát v úvahu.

Předpokládejme, že chceme hledat filmy, které začínají písmeny a, b, c nebo d , za nimiž následuje libovolný počet dalších znaků, jak bychom toho dosáhli. K dosažení požadovaných výsledků můžeme použít regulární výraz spolu s metaznaky.

SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';

Spuštění výše uvedeného skriptu v MySQL ponk proti myflixdb nám dává následující výsledky.

movie_id title director year_released category_id
4 Code Name Black Edgar Jimz 2010 NULL
5 Daddy's Little Girls NULL 2007 8
6 Angels and Demons NULL 2007 6
7 Davinci Code NULL 2007 6

Pojďme se nyní blíže podívat na náš regulární výraz zodpovědný za výše uvedený výsledek.

'^[abcd]' stříška (^) znamená, že shoda vzoru by měla být použita na začátku a charlist [abcd] znamená, že v naší výsledkové sadě budou vráceny pouze názvy filmů, které začínají na a, b, c nebo d.

Upravme náš výše uvedený skript a použijme NOT charlist a uvidíme, jaké výsledky získáme po provedení našeho dotazu.

SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';

Spuštění výše uvedeného skriptu v MySQL workbench proti myflixdb nám dává následující výsledky.

movie_id title director year_released category_id
1 Pirates of the Caribean 4 Rob Marshall 2011 1
2 Forgetting Sarah Marshal Nicholas Stoller 2008 2
3 X-Men 2008
9 Honey mooners John Schultz 2005 8
16 67% Guilty 2012
17 The Great Dictator Chalie Chaplie 1920 7
18 sample movie Anonymous 8
19 movie 3 John Brown 1920 8

Pojďme se nyní blíže podívat na náš regulární výraz zodpovědný za výše uvedené výsledky.

'^[^abcd]' stříška (^) znamená, že shoda vzoru by měla být použita na začátku a charlist [^abcd] znamená, že názvy filmů začínající kterýmkoli z uzavřených znaků jsou vyloučeny ze sady výsledků.

Metaznaky regulárních výrazů

To, na co jsme se podívali ve výše uvedeném příkladu, je nejjednodušší forma regulárního výrazu. Podívejme se nyní na pokročilejší shody vzorů regulárních výrazů. Předpokládejme, že chceme hledat názvy filmů, které začínají vzorem „kód“ pouze pomocí regulárního výrazu, jak bychom na to přišli? Odpovědí jsou metaznaky. Umožňují nám doladit výsledky vyhledávání vzorů pomocí regulárních výrazů.

Char Description Příklad
* Jedno hvězdička (*) metaznak se používá ke shodě s nulou (0) nebo více výskyty řetězců, které mu předcházejí SELECT * Z filmů WHERE název REGEXP 'da*'; dá všem filmům obsahujícím postavy „da“. Například Da Vinci Code, Daddy's Little Girls.
+ Jedno více (+) metaznak se používá ke shodě s jedním nebo více výskyty řetězců, které mu předcházejí. SELECT * FROM `filmy` WHERE `title` REGEXP 'mon+'; dá všem filmům obsahujícím postavy „po“. Například Andělé a démoni.
? Otázka(?) metaznak se používá ke shodě s nulou (0) nebo jednou instancí řetězců, které mu předcházejí. SELECT * FROM `categories` WHERE `category_name` REGEXP 'com?'; dá všechny kategorie obsahující řetězec com .Například komedie , romantická komedie .
. Jedno tečka (.) metaznak se používá pro shodu libovolného jednotlivého znaku s výjimkou nového řádku. SELECT * FROM movies WHERE `year_released` REGEXP '200.'; uvede všechny filmy vydané v letech počínaje znaky „200“ následovanými libovolným jediným znakem. Například 2005,2007,2008, XNUMX, XNUMX atd.
[abc] Jedno charlist [abc] se používá pro shodu s libovolným z přiložených znaků. SELECT * FROM `filmy` WHERE `title` REGEXP '[vwxyz]'; poskytne všechny filmy obsahující jakoukoli jednotlivou postavu v „vwxyz“. Například X-Men, Da Vinci Code atd.
[^abc] Jedno charlist [^abc] se používá k přiřazení libovolných znaků kromě těch, které jsou uvedeny v příloze. SELECT * FROM `filmy` WHERE `title` REGEXP '^[^vwxyz]'; dá všechny filmy obsahující jiné postavy než ty v „vwxyz“.
[AZ] Jedno [AZ] se používá pro shodu s jakýmkoli velkým písmenem. SELECT * FROM `členové` WHERE `poštovní_adresa` REGEXP '[AZ]'; poskytne všem členům, kteří mají poštovní adresu obsahující jakýkoli znak od A do Z. Například Janet Jones s členským číslem 1.
[az] Jedno [az] se používá pro shodu s jakýmkoli malým písmenem SELECT * FROM `členové` WHERE `poštovní_adresa` REGEXP '[az]'; dá všem členům, kteří mají poštovní adresy obsahující jakýkoli znak od a do z. .Například Janet Jones s členským číslem 1.
[0-9] Jedno [0-9] se používá k přiřazení libovolné číslice od 0 do 9. SELECT * FROM `členové` WHERE `contact_number` REGEXP '[0-9]' poskytne všem členům, kteří odeslali kontaktní čísla obsahující znaky „[0-9]“. Například Robert Phil.
^ Jedno stříška (^) se používá k zahájení zápasu na začátku. SELECT * FROM `filmy` WHERE `title` REGEXP '^[cd]'; uvádí všechny filmy s názvem začínajícím kteroukoli z postav na „cd“. Například Code Name Black, Daddy's Little Girls a Da Vinci Code.
| Jedno svislý pruh (|) se používá k izolaci alternativ. SELECT * FROM `filmy` WHERE `title` REGEXP '^[cd]|^[u]'; uvádí všechny filmy s názvem začínajícím kteroukoli z postav v „cd“ nebo „u“. Například Code Name Black, Daddy's Little Girl, Da Vinci Code a Underworld – AwakenIng.
[[:<:]] Jedno[[:<:]] odpovídá začátku slov. SELECT * FROM `filmy` WHERE `title` REGEXP '[[:<:]]for';

uvádí všechny filmy s názvy začínajícími postavami. Například: Forgeting Sarah Marshal.

[[:>:]] Jedno [[:>:]] odpovídá konci slov. SELECT * FROM `filmy` WHERE `název` REGEXP 'ack[[:>:]]';

dává všem filmům s názvy končícími postavami „akce“

.Například kódové jméno Černá.

[:třída:] Jedno [:třída:] odpovídá třídě postavy, tzn

[:alpha:] sladit písmena, [:prostor:] aby odpovídaly bílému prostoru, [:punct:] odpovídá interpunkci a [:upper:] pro písmena vyšší třídy.

SELECT * FROM `filmy` WHERE `title` REGEXP '[:alpha:]';

dává všem filmům, jejichž názvy jsou pouze písmena

.Například Forgetting Sarah Marshal, X-Men atd.

Film jako Piráti z Karibiku 4 bude tento dotaz vynechán.

Zpětné lomítko (\) se používá jako znak escape. Pokud jej chceme použít jako součást vzoru v regulárním výrazu, měli bychom použít dvojitá zpětná lomítka (\\)

Shrnutí

  • Regulární výrazy poskytují výkonnou a flexibilní shodu vzorů, která nám může pomoci implementovat pomocné vyhledávací nástroje pro naše databázové systémy.
  • REGEXP je operátor používaný při provádění shody vzorů regulárních výrazů. RLIKE je synonymum
  • Regulární výrazy podporují řadu metaznaků, které umožňují větší flexibilitu a kontrolu při provádění shody vzorů.
  • Zpětné lomítko se používá jako znak escape v regulárních výrazech. Při shodě vzoru se bere v úvahu pouze v případě, že byla použita dvojitá zpětná lomítka.
  • Regulární výrazy nerozlišují velká a malá písmena.