標籤:
Regex是用來匹配文本的特殊的串(字元集和)。比如從文字檔中提取電話號碼。
基底字元匹配
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]) |
匹配多個字元
前面使用的Regex都試圖匹配單次出現,但有時需要對匹配的數目有更強的控制。
重複元字元
元字元 |
說明 |
* |
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\\.]‘
MySQLRegex