Regex (MySQL)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

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