Wat zijn reguliere expressies?
Reguliere expressies helpen bij het zoeken naar gegevens die voldoen aan complexe criteria. We hebben in de vorige tutorial naar jokertekens gekeken. Als u eerder met jokertekens hebt gewerkt, vraagt u zich misschien af waarom u reguliere expressies leert als u vergelijkbare resultaten kunt krijgen met de jokertekens. Omdat reguliere expressies ons, in vergelijking met jokertekens, in staat stellen gegevens te zoeken die overeenkomen met een nog complexer criterium.
Basissyntaxis
De basissyntaxis voor een reguliere expressie is als volgt
SELECT statements… WHERE fieldname REGEXP 'pattern';
HIER -
- "SELECT-instructies ..." is de standaard SELECT-instructie
- "WAAR veldnaam" is de naam van de kolom waarop de reguliere expressie moet worden uitgevoerd.
- "REGEXP 'patroon'" REGEXP is de operator voor reguliere expressies en 'patroon' staat voor het patroon waarmee REGEXP moet overeenkomen. RLIKE is het synoniem voor REGEXP en behaalt dezelfde resultaten als REGEXP. Om verwarring met de LIKE-operator te voorkomen, is het beter om in plaats daarvan REGEXP te 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 films willen zoeken die beginnen met a, b, c of d, gevolgd door een aantal andere karakters, hoe zouden we dat willen bereiken? We kunnen een reguliere expressie samen met de metatekens gebruiken om de gewenste resultaten te bereiken.
SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';
Het uitvoeren van het bovenstaande script in MySQL-workbench tegen de 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]' het 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 worden geretourneerd in onze resultatenset.
Laten we ons bovenstaande script aanpassen en de NOT charlist gebruiken en kijken welke resultaten we zullen krijgen na het uitvoeren van onze query.
SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';
Het uitvoeren van het bovenstaande script in MySQL-workbench tegen de 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]' het 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 omsloten karakters worden uitgesloten van de resultaatset.
Metatekens voor reguliere expressies
Wat we in het bovenstaande voorbeeld hebben bekeken, is de eenvoudigste vorm van een reguliere expressie. Laten we nu eens kijken naar meer geavanceerde overeenkomsten voor reguliere expressiepatronen. Stel dat we alleen met een reguliere expressie naar filmtitels willen zoeken die beginnen met het patroon "code", hoe zouden we dat dan aanpakken? Het antwoord is metatekens. Ze stellen ons in staat om onze patroonzoekresultaten te verfijnen met behulp van reguliere expressies.
Char | Omschrijving | Voorbeeld | |
---|---|---|---|
| Het metateken asterisk (*) wordt gebruikt om overeen te komen met nul (0) of meer instanties van de tekenreeksen die eraan voorafgaan | SELECTEER * UIT films WAAR titel REGEXP 'da *'; geeft alle films met de karakters "da". Bijvoorbeeld, Da Vinci Code, Daddy's Little Girls. | |
| Het plus (+) metateken wordt gebruikt om overeen te komen met een of meer instanties van tekenreeksen die eraan voorafgaan. | SELECTEER * UIT `films` WAAR` titel` REGEXP 'mon +'; geeft alle films met karakters "mon". Bijvoorbeeld, Angels and Demons. | |
| Het metateken van de vraag (?) Wordt gebruikt om nul (0) of één instantie van de tekenreeksen die eraan voorafgaan, te matchen. | SELECTEER * UIT `categorieën` WAAR` categorie_naam` REGEXP 'com?'; geeft alle categorieën met string com. Bijvoorbeeld komedie, romantische komedie. | |
| Het metateken met de punt (.) Wordt gebruikt om met elk willekeurig teken overeen te komen, met uitzondering van een nieuwe regel. | SELECTEER * UIT films WAAR `year_released` REGEXP '200.'; geeft alle films die in de jaren zijn uitgebracht, beginnend met 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 karakters. | SELECTEER * UIT `films` WAAR` titel` REGEXP '[vwxyz]'; geeft alle films met een enkel personage in "vwxyz". Bijvoorbeeld X-Men, Da Vinci Code, enz. | |
[abc] | De charlist [abc] wordt gebruikt om alle karakters te matchen met uitzondering van de ingesloten karakters. | SELECTEER * UIT `films` WAAR` titel` REGEXP '[vwxyz]'; geeft alle films met andere karakters dan die in "vwxyz". | |
[AZ] | De [AZ] wordt gebruikt om overeen te komen met hoofdletters. | SELECTEER * UIT `leden` WAAR` postadres` REGEXP '[AZ]'; geeft alle leden met een postadres dat een willekeurig teken van A tot Z bevat… Bijvoorbeeld Janet Jones met lidmaatschapsnummer 1. | |
[az] | De [az] wordt gebruikt om overeen te komen met kleine letters | SELECTEER * UIT `leden` WAAR` postadres` REGEXP '[az]'; geeft alle leden met een postadres met een willekeurig teken van a tot z… Bijvoorbeeld Janet Jones met lidmaatschapsnummer 1. | |
[0-9] | De [0-9] wordt gebruikt om een cijfer van 0 tot en met 9 te matchen. | SELECTEER * UIT `leden` WAAR` contact_nummer` REGEXP '[0-9]' geeft aan dat alle leden contactnummers hebben opgegeven met de tekens "[0-9]". Bijvoorbeeld, Robert Phil. | |
| Het caret (^) wordt gebruikt om de wedstrijd aan het begin te starten. | SELECTEER * UIT `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. | SELECTEER * UIT `films` WAAR` titel` REGEXP '[cd] | [u]'; geeft alle films waarvan de titel begint met een van de karakters in "cd" of "u". Bijvoorbeeld codenaam Black, Daddy's Little Girl, Da Vinci Code en Underworld - Awakening. | |
| De [[: <:]] komt overeen met het begin van woorden. | SELECTEER * UIT `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. | SELECTEER * UIT `films` WAAR` titel` REGEXP 'ack [[:>:]]'; geeft alle films met titels die eindigen op de tekens "ack". Bijvoorbeeld: codenaam zwart. | |
[:klasse:] | De [: class:] komt overeen met een karakterklasse, dwz [: alpha:] om letters te matchen, [: spatie:] om overeen te komen met witruimte, [: punct:] is match interpunctie 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, Sarah Marshal vergeten, X-Men enz. Film zoals Pirates of the Caribbean 4 zal door deze zoekopdracht worden weggelaten. |
De backslash (\) wordt gebruikt als escape-teken. Als we het willen gebruiken als onderdeel van het patroon in een reguliere expressie, moeten we dubbele backslashes (\\) gebruiken
Overzicht
- Reguliere expressies bieden een krachtige en flexibele patroonovereenkomst die ons kan helpen bij het implementeren van power search-hulpprogramma's voor onze databasesystemen.
- REGEXP is de operator die wordt gebruikt bij het uitvoeren van overeenkomsten voor reguliere expressiepatronen. RLIKE is het synoniem
- Reguliere expressies ondersteunen een aantal metatekens die meer flexibiliteit en controle bieden bij het uitvoeren van patroonovereenkomsten.
- De backslash wordt gebruikt als een escape-teken in reguliere expressies. Het wordt alleen in de patroonovereenkomst overwogen als dubbele backslashes zijn gebruikt.
- Reguliere expressies zijn niet hoofdlettergevoelig.