MYSQL reguliere expressies (REGEXP) met syntaxis en voorbeelden
Wat zijn reguliere expressies?
Reguliere expressies helpen bij het zoeken naar gegevens die voldoen aan complexe criteria. We hebben wildcards in de vorige tutorial bekeken. Als u eerder met wildcards hebt gewerkt, vraagt u zich misschien af waarom u reguliere expressies zou moeten leren als u vergelijkbare resultaten kunt krijgen met de wildcards. Omdat, vergeleken met wildcards, reguliere expressies ons in staat stellen om gegevens te zoeken die voldoen aan nog complexere criteria.
Basissyntaxis
De basissyntaxis voor een reguliere expressie is als volgt
SELECT statements... WHERE fieldname REGEXP 'pattern';
HIER -
- "SELECT-instructies..." is de standaard SELECT-instructie
- “WHERE veldnaam” is de naam van de kolom waarop de reguliere expressie moet worden uitgevoerd.
- “REGEXP 'patroon'” REGEXP is de reguliere expressie-operator en 'patroon' vertegenwoordigt het patroon dat door REGEXP moet worden vergeleken. RLIKE is de synoniem voor REGEXP en bereikt dezelfde resultaten als REGEXP. Om verwarring met de LIKE-operator te voorkomen, het is beter om REGEXP te gebruiken gebruiken.
Laten we nu naar een praktisch voorbeeld kijken:
SELECT * FROM `movies` WHERE `title` REGEXP 'code';
De bovenstaande zoekopdracht zoekt naar alle filmtitels die de woordcode bevatten. Het maakt niet uit of de “code” aan het begin, midden of einde van de titel staat. Zolang het in de titel staat, wordt het in overweging genomen.
Stel dat we willen zoeken naar films die beginnen met a, b, c of d , gevolgd door een willekeurig aantal andere karakters. Hoe zouden we dat dan kunnen bereiken? We kunnen een reguliere expressie samen met de metatekens gebruiken om de gewenste resultaten te bereiken.
SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';
Voer het bovenstaande script uit in MySQL werkbank tegen myflixdb geeft ons de volgende resultaten.
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 |
Laten we nu eens goed kijken naar onze reguliere expressie die verantwoordelijk is voor het bovenstaande resultaat.
'^[abcd]' de caret (^) betekent dat de patroonovereenkomst aan het begin moet worden toegepast en de charlist [abcd] betekent dat alleen filmtitels die beginnen met a, b, c of d in onze resultatenset worden geretourneerd.
Laten we ons bovenstaande script aanpassen en de NOT charlist gebruiken en kijken welke resultaten we krijgen na het uitvoeren van onze query.
SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';
Voer het bovenstaande script uit in MySQL workbench vergeleken met myflixdb geeft ons de volgende resultaten.
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 |
Laten we nu eens goed kijken naar onze reguliere expressie die verantwoordelijk is voor de bovenstaande resultaten.
'^[^abcd]' de caret (^) betekent dat de patroonovereenkomst aan het begin moet worden toegepast en de charlist [^abcd] betekent dat de filmtitels die beginnen met een van de ingesloten tekens, worden uitgesloten van de resultatenset.
Metatekens voor reguliere expressies
Waar we in het bovenstaande voorbeeld naar hebben gekeken, is de eenvoudigste vorm van een reguliere expressie. Laten we nu eens kijken naar meer geavanceerde patroonovereenkomsten voor reguliere expressies. Stel dat we alleen met behulp van een reguliere expressie naar filmtitels willen zoeken die beginnen met het patroon 'code', hoe zouden we dat dan aanpakken? Het antwoord is metakarakters. Ze stellen ons in staat onze patroonzoekresultaten te verfijnen met behulp van reguliere expressies.
Verkolen | Beschrijving | Voorbeeld | |
---|---|---|---|
* | De sterretje (*) metateken wordt gebruikt om nul (0) of meer exemplaren van de daaraan voorafgaande tekenreeksen te matchen | SELECTEER * UIT films WAAR titel REGEXP 'da*'; geeft alle films met karakters “da” weer. Bijvoorbeeld Da Vinci Code, Daddy's Little Girls. | |
+ | De meer (+) metakarakter wordt gebruikt om een of meer exemplaren van tekenreeksen die eraan voorafgaan, te matchen. | SELECTEER * UIT `films` WAAR `titel` REGEXP 'mon+'; geeft alle films met karakters “mon” weer. Bijvoorbeeld engelen en demonen. | |
? | De vraag(?) metakarakter wordt gebruikt om nul (0) of één instantie van de voorgaande strings te matchen. | SELECT * VAN `categorieën` WAAR `categorie_naam` REGEXP 'com?'; geeft alle categorieën die string com bevatten. Bijvoorbeeld komedie, romantische komedie. | |
. | De punt (.) metateken wordt gebruikt om elk enkel teken te matchen, met uitzondering van een nieuwe regel. | SELECT * UIT films WAAR `year_released` REGEXP '200.'; geeft alle films weer die in de loop der jaren zijn uitgebracht, beginnend met de tekens “200”, gevolgd door een enkel teken. Bijvoorbeeld 2005,2007,2008 enz. | |
[abc] | De Charlist [abc] wordt gebruikt om overeen te komen met een van de ingesloten tekens. | SELECTEER * UIT `films` WAAR `titel` REGEXP '[vwxyz]'; geeft alle films weer die een enkel personage in "vwxyz" bevatten. Bijvoorbeeld X-Men, Da Vinci Code, enz. | |
[^ abc] | De Charlist [^abc] wordt gebruikt om alle tekens te matchen, met uitzondering van de ingesloten tekens. | SELECT * VAN `films` WAAR `titel` REGEXP '^[^vwxyz]'; geeft alle films weer die andere karakters bevatten dan die in “vwxyz”. | |
[AZ] | De [AZ] wordt gebruikt om elke hoofdletter aan te passen. | SELECT * VAN `leden` WAAR `postadres` REGEXP '[AZ]'; geeft alle leden met een postadres met een teken van A tot Z. Bijvoorbeeld Janet Jones met lidmaatschapsnummer 1. | |
[az] | De [az] wordt gebruikt om met elke kleine letter overeen te komen | SELECT * VAN `leden` WAAR `postadres` REGEXP '[az]'; geeft alle leden die een postadres hebben met een teken van a tot z. .Bijvoorbeeld Janet Jones met lidmaatschapsnummer 1. | |
[0-9] | De [0-9] wordt gebruikt om elk cijfer van 0 tot en met 9 te matchen. | SELECT * FROM `leden` WHERE `contactnummer` REGEXP '[0-9]' zal alle leden die contactnummers hebben ingediend die de tekens "[0-9]" bevatten, geven. Bijvoorbeeld Robert Phil. | |
^ | De dakje (^) wordt gebruikt om de wedstrijd bij het begin te starten. | SELECT * VAN `films` WAAR `titel` REGEXP '^[cd]'; geeft alle films waarvan de titel begint met een van de karakters in “cd”. Bijvoorbeeld Codenaam Zwart, Daddy's Little Girls en Da Vinci Code. | |
| | De verticale balk (|) wordt gebruikt om alternatieven te isoleren. | SELECT * VAN `films` WAAR `titel` REGEXP '^[cd]|^[u]'; geeft alle films waarvan de titel begint met een van de tekens in “cd” of “u”. Bijvoorbeeld Codenaam Zwart, Daddy's Little Girl, Da Vinci Code en Underworld – AwakenIng. | |
[[:<:]] | De[[:<:]] komt overeen met het begin van woorden. | SELECT * VAN `films` WAAR `titel` REGEXP '[[:<:]]voor';
geeft alle films met titels die beginnen met de personages. Bijvoorbeeld: Sarah Marshal vergeten. |
|
[[:>:]] | De [[:>:]] komt overeen met het einde van woorden. | SELECT * VAN `films` WAAR `titel` REGEXP 'ack[[:>:]]';
geeft alle films weer waarvan de titel eindigt met de karakters “ack” .Bijvoorbeeld codenaam Zwart. |
|
[:klas:] | De [:klas:] komt overeen met een karakterklasse, dwz
[:alfa:] letters matchen, [:ruimte:] om de witte ruimte aan te passen, [:punt:] is overeenkomende leestekens en [:upper:] voor letters uit de hogere klasse. |
SELECTEER * UIT `films` WAAR `titel` REGEXP '[:alpha:]';
geeft aan dat alle films met titels alleen letters bevatten .Bijvoorbeeld het vergeten van Sarah Marshal, X-Men enz. Films als Pirates of the Caribbean 4 worden bij deze zoekopdracht weggelaten. |
De backslash (\) wordt gebruikt als een escape-teken. Als we het willen gebruiken als onderdeel van het patroon in een reguliere expressie, moeten we dubbele backslashes gebruiken (\\)
Samenvatting
- Reguliere expressies bieden een krachtige en flexibele patroonmatch die ons kan helpen bij het implementeren van krachtige zoekprogramma's voor onze databasesystemen.
- REGEXP is de operator die wordt gebruikt bij het uitvoeren van overeenkomsten met reguliere expressiepatronen. RLIKE is het synoniem
- Reguliere expressies ondersteunen een aantal metatekens die meer flexibiliteit en controle mogelijk maken bij het uitvoeren van patroonovereenkomsten.
- De backslash wordt gebruikt als escape-teken in reguliere expressies. Het wordt alleen meegenomen in de patroonmatch als er dubbele backslashes zijn gebruikt.
- Reguliere expressies zijn niet hoofdlettergevoelig.