Regex (MySQL)
Versie door Jeroen Strompf (overleg | bijdragen) op 11 okt 2016 om 15:36 (→Alle velden met een ( en een ))
MySQL kent reguliere expressies. Deze kun je gebruiken als selectiecriteria. Je kunt ze helaas niet gebruiken voor extractie van tekenreeksen, bv. substrings.
Algemene formulering bij gebruik met select-statements:
select * from tbl_blub where fld_y regexp 'expressie';
Match substring
select vld_a from tbl_t where vld_a regexp '999'; -- Alle strings waar '999' in voorkomt
Match beginning of string ^
select vld_a from tbl_t where vld_a regexp '^0'; -- Alle string die beginnen met 0
Match ending of string $
select vld_a from tbl_t where vld_a regexp '5$'; -- Alle string die eindigen op 5
Match begin & eind
-- ^0 - Beginnend met een 0 -- .* - Daarna een willekeurig aantal (*) willekeurige tekens (.) -- 3$ - Eindigend met een 3 -- select vld_a from tbl_t where vld_a regexp '^0.*3$';
-- Alle record met maar 1 cijfer: -- select * from tbl_i where vld_a regexp "^[0-9]$";
Match OR |
select vld_a from tbl_t where vld_a regexp '000|999'; -- Alle string met '000' of '999'
Precedence ()
select vld_a from tbl_t where vld_a regexp '^0|9'; -- Alle string die beginnen met 0, of waarin '9' voorkomt select vld_a from tbl_t where vld_a regexp '^1|^9'; -- Alle string die beginnen met 1, of beginnen met 9 select vld_a from tbl_t where vld_a regexp '^(1|9)'; -- Alle string die beginnen met 1, of beginnen met 9 select vld_a from tbl_t where vld_a regexp '^(1|9)3'; -- Alle string die beginnen met 13 of 19
Wildcard .
De wildcard matched met elk teken, maar niet met NULL:
select vld_a from tbl_t where vld_a regexp '.' -- Alle niet-lege strings select vld_a from tbl_t where vld_a regexp '.*' -- Alle lege en niet-lege strings, want * betekent dat 0 keer matchen ook ok is
Soorten tekens
[0-9] -- Cijfers 0-9 [a-zA-Z] -- Alle letters, zoals klein als groot [a-zA-Z0-9] -- Alle letters & cijfers [a-zA-Z0-9 ] -- Alle lettters, cijfers en spaties
Specifiekere voorbeelden:
-- Begin met een code van minimaal 6 cijfers/letters/spaties, daarna ", " en een code van drie tekens -- Voorbeelden van matches: -- -- 606209000, 001, 190, 250, 420 -- 9 617 081 541, 542 -- ^[a-zA-Z0-9 ]{6,}, [a-zA-Z0-9]{3}
Aantallen * + ?
? - 0 of 1 keer * - 0 of meer + - 1 of meer
Herhalingen {}
select vld_a from tbl_t where vld_a regexp '[0-9]{6}'; -- Alle strings met 6 cijfers op rij
select vld_a from tbl_t where vld_a regexp '3[0-9]{5}3[0-9]{5}'; -- -- Alle string met 12 cijfers op rij -- Die beginnen met een 3, gevolgd door 5 cijfers -- Daarna weer een 3, gevolgd door 5 cijfers
-- select vld_a from tbl_t where vld_a regexp '[ ]{3,},?.?[ ]?0' -- -- Selecteer strings met drie of meer spatie's, gevolgd door eventueel een komma, eventueel een punt, -- eventueel een spatie, gevolgd door een nul
regexp "[ ]{3,},?.?[ ]?(0|3)" -- -- Minimaal 3 spaties -- Eventueel een komma -- Eventueel een punt -- Eventueel een spatie -- Gevolgd door een 0 of een 3.
Meer voorbeelden
Selecteer alle nodes waarvan de titel begint met Koolborstelset gevolgd door een nummer van vier cijfers, dat begint met een 3, 4, 5 of 6, en daarna niets:
SELECT title FROM node where title regexp '^Koolborstelset (3|4|5|6)[0-9]{3}$';
Alle velden met een ( en een )
regexp "\\(.+\\)"; -- Haakje openen & haakje sluiten, moet je beiden escapen. .+ geeft aan, dat er minimaal 1 teken tussen ( en ) moet staan