Description of MySQL regular expression syntax.

Regular expressions are a powerful way of specifying complex searches.

MySQL uses Henry Spencer's implementation of regular expressions. And that is aimed to conform to POSIX 1003.2. MySQL uses the extended version.

To get more exact information see Henry Spencer's regex.7 manual.

This is a simplistic reference that skips the details. From here on a regular expression is called a regexp.

A regular expression describes a set of strings. The simplest case is one that has no special characters in it. For example the regexp hello matches hello and nothing else.

Nontrivial regular expressions use certain special constructs so that they can match more than one string. For example, the regexp hello|word matches either the string hello or the string word.

And a more complex example regexp B[an]*s matches any of the strings Bananas, Baaaaas, Bs and all other string starting with a B and continuing with any number of a n and ending with a s.

The following special characters/constructs are known.

^
Start of whole string.
mysql> select "fo\nfo" regexp "^fo$";           -> 0
mysql> select "fofo" regexp "^fo";              -> 1
$
End of whole string.
mysql> select "fo\no" regexp "^fo\no$";         -> 1
mysql> select "fo\no" regexp "^fo$";            -> 0
.
Any character (including newline).
mysql> select "fofo" regexp "^f.*";             -> 1
mysql> select "fo\nfo" regexp "^f.*";           -> 1
a*
Any sequence of zero or more a's.
mysql> select "Ban" regexp "^Ba*n";             -> 1
mysql> select "Baaan" regexp "^Ba*n";           -> 1
mysql> select "Bn" regexp "^Ba*n";              -> 1
a+
Any sequence of one or more a's.
mysql> select "Ban" regexp "^Ba+n";             -> 1
mysql> select "Bn" regexp "^Ba+n";              -> 0
a?
Either zero or one a.
mysql> select "Bn" regexp "^Ba?n";              -> 1
mysql> select "Ban" regexp "^Ba?n";             -> 1
mysql> select "Baan" regexp "^Ba?n";            -> 0
de|abc
Either the sequence de or abc.
mysql> select "pi" regexp "pi|apa";             -> 1
mysql> select "axe" regexp "pi|apa";            -> 0
mysql> select "apa" regexp "pi|apa";            -> 1
mysql> select "apa" regexp "^(pi|apa)$";        -> 1
mysql> select "pi" regexp "^(pi|apa)$";         -> 1
mysql> select "pix" regexp "^(pi|apa)$";        -> 0
(abc)*
Zero or more times the sequence abc.
mysql> select "pi" regexp "^(pi)+$";            -> 1
mysql> select "pip" regexp "^(pi)+$";           -> 0
mysql> select "pipi" regexp "^(pi)+$";          -> 1
{1}
{2,3}
There is a more general way of writing regexps that match many occurrences.
a*
Can be written as a{0,}.
+
Can be written as a{1,}.
?
Can be written as a{0,1}.
To be more precise, an atom followed by a bound containing one integer i and no comma matches a sequence of exactly i matches of the atom. An atom followed by a bound containing one integer i and a comma matches a sequence of i or more matches of the atom. An atom followed by a bound containing two integers i and j matches a sequence of i through j (inclusive) matches of the atom. Both arguments must 0 >= value <= RE_DUP_MAX (default 255), and if there are two of them, the second must be bigger or equal to the first.
[a-dX]
[^a-dX]
Any character which is (not if ^ is used) either a, b, c, d or X. To include ] it has to be written first. To include - it has to be written first or last. So [0-9] matches any decimal digit. All character that does not have a defined meaning inside a [] pair has no special meaning and matches only itself.
mysql> select "aXbc" regexp "[a-dXYZ]";         -> 1
mysql> select "aXbc" regexp "^[a-dXYZ]$";       -> 0
mysql> select "aXbc" regexp "^[a-dXYZ]+$";      -> 1
mysql> select "aXbc" regexp "^[^a-dXYZ]+$";     -> 0
mysql> select "gheis" regexp "^[^a-dXYZ]+$";    -> 1
mysql> select "gheisa" regexp "^[^a-dXYZ]+$";   -> 0
[[.characters.]]
The sequence of characters of that collating element. The sequence is a single element of the bracket expression's list. A bracket expression containing a multi-character collating element can thus match more than one character, e.g. if the collating sequence includes a ch collating element, then the RE [[.ch.]]*c matches the first five characters of chchcc.
[=character-class=]
An equivalence class, standing for the sequences of characters of all collating elements equivalent to that one, including itself. For example, if o and (+) are the members of an equivalence class, then [[=o=]], [[=(+)=]], and [o(+)] are all synonymous. An equivalence class may not be an endpoint of a range.
[:character_class:]
Within a bracket expression, the name of a character class enclosed in [: and :] stands for the list of all characters belonging to that class. Standard character class names are:
alnum  digit  punct 
alpha  graph  space 
blank  lower  upper 
cntrl  print  xdigit 
These stand for the character classes defined in ctype(3). A locale may provide others. A character class may not be used as an endpoint of a range.
mysql> select "justalnums" regexp "[[:alnum:]]+";       -> 1
mysql> select "!!" regexp "[[:alnum:]]+";               -> 0
  • [[:<:]]
  • [[:>:]] These match the null string at the beginning and end of a word respectively. A word is defined as a sequence of word characters which is neither preceded nor followed by word characters. A word character is an alnum character (as defined by ctype(3)) or an underscore.
  • mysql> select "a word a" regexp "[[:<:]]word[[:>:]]";      -> 1
    mysql> select "a xword a" regexp "[[:<:]]word[[:>:]]";     -> 0
    mysql> select "weeknights" regexp "^(wee|week)(knights|nights)$"; -> 1