In MySQL is de REGEXP
operator wordt gebruikt om te bepalen of een tekenreeks al dan niet overeenkomt met een reguliere expressie. Het is een synoniem voor REGEXP_LIKE()
.
Als de tekenreeks overeenkomt met de opgegeven reguliere expressie, is het resultaat 1
, anders is het 0
.
Syntaxis
De syntaxis gaat als volgt:
expr REGEXP pat
Waar expr
is de invoerreeks en pat
is de reguliere expressie waarvoor u de string test.
Voorbeeld 1 – Basis reguliere expressie
De meest elementaire reguliere expressie die we kunnen gebruiken, is er een die geen speciale tekens bevat. Hier gebruiken we gewoon een string. Als een deel van de invoerreeks overeenkomt met die tekenreeks, wordt een overeenkomst geretourneerd.
SELECT 'Corn' REGEXP 'Corn' AS 'Corn', 'Acorn' REGEXP 'Corn' AS 'Acorn', 'Corner' REGEXP 'Corn' AS 'Corner', 'Cheese' REGEXP 'Corn' AS 'Cheese';
Resultaat:
+------+-------+--------+--------+ | Corn | Acorn | Corner | Cheese | +------+-------+--------+--------+ | 1 | 1 | 1 | 0 | +------+-------+--------+--------+
Voorbeeld 2 – Overeenkomen met het begin van een string
In dit voorbeeld geeft de reguliere expressie aan dat de tekenreeks moet beginnen met Co
.
SELECT 'Corn' REGEXP '^Co' AS 'Corn', 'Acorn' REGEXP '^Co' AS 'Acorn', 'Cheese' REGEXP '^Co' AS 'Cheese';
Resultaat:
+------+-------+--------+ | Corn | Acorn | Cheese | +------+-------+--------+ | 1 | 0 | 0 | +------+-------+--------+
Voorbeeld 3 – Overeenkomen met het einde van een string
In dit voorbeeld specificeert de reguliere expressie dat de string moet eindigen op rn
.
SELECT 'Corn' REGEXP 'rn$' AS 'Corn', 'Acorn' REGEXP 'rn$' AS 'Acorn', 'Cheese' REGEXP 'rn$' AS 'Cheese';
Resultaat:
+------+-------+--------+ | Corn | Acorn | Cheese | +------+-------+--------+ | 1 | 1 | 0 | +------+-------+--------+
Voorbeeld 4 – Overeenkomen met elk personage
De .
karakter komt overeen met elk karakter.
SELECT 'Corn' REGEXP '.' AS 'Corn', 'Cheese' REGEXP '.' AS 'Cheese', '' REGEXP '.' AS '';
Resultaat:
+------+--------+---+ | Corn | Cheese | | +------+--------+---+ | 1 | 1 | 0 | +------+--------+---+
Dit teken wordt meestal gebruikt in combinatie met andere tekens om verdere criteria te specificeren. Bijvoorbeeld:
SELECT 'Corn' REGEXP '^C.rn$' AS 'Corn', 'Crn' REGEXP '^C.rn$' AS 'Crn';
Resultaat:
+------+-----+ | Corn | Crn | +------+-----+ | 1 | 0 | +------+-----+
Hier specificeren we dat de string moet beginnen met C
, dat het moet worden gevolgd door een teken (elk teken) en dat het moet eindigen op rn
.
Merk op dat dit teken een enkele instantie van het teken aangeeft. Als u meerdere instanties wilt specificeren (bijvoorbeeld ee
in plaats van alleen e
), moet je meer .
tekens.
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';
Resultaat:
+-------+-------+-------+------+ | Tweet | Tweat | Tweet | Twit | +-------+-------+-------+------+ | 1 | 1 | 0 | 0 | +-------+-------+-------+------+
Een andere manier om dit te doen is door het aantal keren dat het voorkomt tussen accolades te specificeren:
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';
Resultaat:
+-------+-------+-------+------+ | Tweet | Tweat | Tweet | Twit | +-------+-------+-------+------+ | 1 | 1 | 0 | 0 | +-------+-------+-------+------+
Als u echter weet welk teken u zoekt, kunt u dat teken specificeren (in plaats van de .
karakter), zoals aangetoond in het volgende voorbeeld.
Voorbeeld 5 – Overeenkomen met nul of meer instanties van een specifiek teken
We kunnen het volgende doen om nul of meer instanties van de e
. te specificeren karakter:
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';
Resultaat:
+------+-------+--------+-----+------+-------+-------+ | Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit | +------+-------+--------+-----+------+-------+-------+ | 1 | 1 | 1 | 1 | 0 | 0 | 0 | +------+-------+--------+-----+------+-------+-------+
De eerste vier komen overeen, maar de laatste drie niet.
Voorbeeld 6 – Match een of meer instanties van een specifiek karakter
We kunnen het vorige voorbeeld aanpassen zodat we alleen een overeenkomst krijgen als één of meer tekens zijn gevonden (het vorige voorbeeld leverde een overeenkomst op als nul of meer gevonden). Om dit te doen, gebruiken we gewoon +
in plaats van *
:
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';
Resultaat:
+------+-------+--------+-----+------+-------+-------+ | Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit | +------+-------+--------+-----+------+-------+-------+ | 1 | 1 | 1 | 0 | 0 | 0 | 0 | +------+-------+--------+-----+------+-------+-------+
In dit geval geeft het vierde woord een ander resultaat dan het vorige voorbeeld.
Voorbeeld 7 – Match nul of één instantie van een specifiek teken
We kunnen het vorige voorbeeld aanpassen zodat we alleen een match krijgen op nul of een van de gewenste karakters. Om dit te doen, gebruiken we ?
:
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';
Resultaat:
+------+-------+--------+-----+------+-------+-------+ | Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit | +------+-------+--------+-----+------+-------+-------+ | 1 | 0 | 0 | 1 | 0 | 0 | 0 | +------+-------+--------+-----+------+-------+-------+
Voorbeeld 8 – Afwisseling
U kunt de |
. gebruiken teken dat overeenkomt met een of andere reeks tekens:
SELECT 'Tweet' REGEXP 'Tw|et' AS 'Tweet', 'For Let' REGEXP 'Tw|et' AS 'For Let', 'Banana' REGEXP 'Tw|et' AS 'Banana';
Resultaat:
+-------+---------+--------+ | Tweet | For Let | Banana | +-------+---------+--------+ | 1 | 1 | 0 | +-------+---------+--------+
Hier is nog een voorbeeld waarbij ik naar hele woorden zoek:
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';
Resultaat:
+-----+-----+---------+--------+ | Cat | Dog | Doggone | Banana | +-----+-----+---------+--------+ | 1 | 1 | 1 | 0 | +-----+-----+---------+--------+
We krijgen nog steeds een overeenkomst, zelfs als onze reguliere expressie slechts met een deel van de tekenreeks overeenkomt.
Voorbeeld 9 – Match nul of meer instanties van een reeks
U kunt haakjes gebruiken samen met de asterisk ()*
om nul of meer exemplaren van een reeks op te geven:
SELECT 'Banana' REGEXP '(an)*' AS 'Banana', 'Land' REGEXP '(an)*' AS 'Land', 'Cheese' REGEXP '(an)*' AS 'Cheese';
Resultaat:
+--------+------+--------+ | Banana | Land | Cheese | +--------+------+--------+ | 1 | 1 | 1 | +--------+------+--------+
Nog een voorbeeld:
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';
Resultaat:
+--------+------+------+-----+ | Banana | Band | Bald | Bad | +--------+------+------+-----+ | 0 | 1 | 0 | 0 | +--------+------+------+-----+
Voorbeeld 10 – Herhaling
Zoals te zien is in een eerder voorbeeld, kunt u accolades gebruiken om herhaling te specificeren. Deze notatie biedt een algemenere manier om reguliere expressies te schrijven dan sommige van de voorgaande voorbeelden:
SELECT 'Tweeet' REGEXP 'e{3}' AS 'Tweeet', 'Tweet' REGEXP 'e{3}' AS 'Tweet';
Resultaat:
+--------+-------+ | Tweeet | Tweet | +--------+-------+ | 1 | 0 | +--------+-------+
Voorbeeld 11 – Bereik
U kunt het koppelteken gebruiken om een bereik op te geven. Hier is een voorbeeld dat een reeks getallen specificeert:
SELECT 'Tweet 123' REGEXP '[0-9]' AS 'Tweet 123', 'Tweet ABC' REGEXP '[0-9]' AS 'Tweet ABC';
Resultaat:
+--------+-------+ | Tweeet | Tweet | +--------+-------+ | 1 | 0 | +--------+-------+
En het volgende voorbeeld specificeert een reeks letters:
SELECT 'Tweet 123' REGEXP '[A-Z]' AS 'Tweet 123', 'ABC' REGEXP '[A-Z]' AS 'ABC', '123' REGEXP '[A-Z]' AS '123';
Resultaat:
+--------+-------+ | Tweeet | Tweet | +--------+-------+ | 1 | 0 | +--------+-------+
Dit is wat er gebeurt als we het bereik van getallen beperken:
SELECT '123' REGEXP '[1-3]' AS '123', '012' REGEXP '[1-3]' AS '012', '045' REGEXP '[1-3]' AS '045';
Resultaat:
+-----+-----+-----+ | 123 | 012 | 045 | +-----+-----+-----+ | 1 | 1 | 0 | +-----+-----+-----+
Voorbeeld 12 – Niet binnen een bereik
We kunnen de ^
. gebruiken karakter om het vorige voorbeeld te wijzigen zodat het gespecificeerde bereik van karakters wordt uitgesloten:
SELECT '123' REGEXP '[^1-3]' AS '123', '012' REGEXP '[^1-3]' AS '012', '045' REGEXP '[^1-3]' AS '045';
Resultaat:
+-----+-----+-----+ | 123 | 012 | 045 | +-----+-----+-----+ | 0 | 1 | 1 | +-----+-----+-----+
We krijgen dus het tegenovergestelde resultaat van het vorige voorbeeld.