Regex (MySQL)

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

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

Zie ook

Bronnen