正則表達式是用來匹配文本的特殊的串(字符集和)。比如從文本文件中提取電話號碼。
基本字符匹配
SELECT name
FROM Customer
WHERE name REGEXP 'li'
LIKE與REGEXP之間的重要差別
SELECT Age
FROM Customer
WHERE Age REGEXP '16'
SELECT Age
FROM Customer
WHERE Age LIKE'1'
如果執行這兩個語句,LIKE不返回數據,REGEXP返回一行
LIKE匹配整個列,如果被匹配的文本僅在列值中出現,like將不會找到它,
而REGEXP在列值內進行匹配,如果被匹配的文本在列值中出現,REGEXP將會找到它
進行OR匹配
SELECT Age
FROM Customer
WHERE Age REGEXP '16|17'
匹配幾個字符之一
SELECT Name
FROM Customer
WHERE Name REGEXP '[123] Ton'
[123]定義一組字符,它的意思是匹配1或2或3,因此,1 ton和2 ton都匹配且返回,
正如所見,[]是另一種形式的OR語句,[123]匹配字符1,2或3,但[^123]卻匹配除去這些字符外的任何東西
匹配范圍
集合可用來定義要匹配的一個或多個字符
[0123456789] 簡化寫法[0-9], 范圍不限於完整的集合[3-8]或[2-9]也是合法的范圍,此外范圍不一定只是數值的,[a-z]匹配任意字母字符。
例如:
SELECT Name
FROM Customer
WHERE Name REGEXP '[1-3] Ton'
匹配特殊字符
如何匹配有特殊含義的字符,如[]、 | 、.
為了匹配特殊字符必須用轉義字符\\為前導,\\-表示查找-,\\.表示查找.
例如:
SELECT Name
FROM Customer
WHERE Name REGEXP '\\.'
\\也用來引用元字符(具有特殊含義的字符)
\\f 換頁
\\n換行
\\r回車
\\t制表
\\v縱向制表
匹配字符類
類 | 說明 |
[:alnum:] | 任意字符和數字(同[a-zA-Z0-9]) |
[:alpha:] | 任意字符([a-zA-Z]) |
[:blank:] | 空格和制表([同\\t]) |
[:cntrl:] | ASCII控制符(ASCII 0到31 和127) |
[:digit:] | 任意數字(同[0-9]) |
[:graph:] | 與print相同但不包括空格 |
[:lower:] | 任意小寫字符如[a-z] |
[:print:] | 任意可打印字符 |
[:punct:] | 既不在 [:alnum:]又不在[:cntrl:]的字符 |
[:space:] | 包含空格在內的任意空白字符(同[\\f\\n\\r\\t\\v]) |
[:upper:] | 任意大寫字符(同[A-Z]) |
[:xdigit:] | 任意十六進制數字([a-fA-F0-9]) |
匹配多個字符
前面使用的正則表達式都試圖匹配單次出現,但有時需要對匹配的數目有更強的控制。
元字符 | 說明 |
* | 0個或多個匹配 |
+ | 1個或多個匹配(等於{1,}) |
? | 0個或1個匹配(等於{0,1}) |
{n} | 指定數目的匹配 |
{n,} | 不少於指定數目的匹配 |
{n,m} | 匹配數目的范圍(m不超過255) |
例如:
SELECT Name
FROM Customer
WHERE Name REGEXP '\\([0-9]\\ sticks?\\)'
定位符
元字符 | 說明 |
^ | 文本的開始 |
$ | 文本的結束 |
[[:<:]] | 詞的開始 |
[[:>:]] | 詞的結尾 |
例如:
SELECT Name
FROM Customer
WHERE Name REGEXP '^[0-9\\.]'