正則表達式的應用
前面的幾節的過濾例子允許用匹配、比較和通配操作符來尋找數據。對于基本的數據過濾,這樣就足夠了。但是隨著過濾條件的復雜性的增加,where子句本身的復雜性也有必要增加。這也就是正則表達式變得有用的地方。
正則表達式是用來匹配文本中特殊的字符集合
MySQL 支持正則表達式的匹配, MySQL中使用 REGEXP 操作符來進行正則表達式匹配。
使用正則表達式查詢和使用like區別是什么?
LIKE匹配整個列。如果被匹配的文本僅在列值中出現,LIKE并不會找到它,相應的行也不會返回(當然,使用通配符除外)。而REGEXP在列值內進行匹配,如果被匹配的匹配的文本在列值中出現,REGEXP將會找到它,相應的行將被返回,這時一個非常重要的差別(當然,如果適應定位符號^和$,可以實現REGEXP匹配整個列而不是列的子集)。
下表中的正則模式可應用于 REGEXP 操作符中。
符號???????????? 含義
^?????????????????? 匹配輸入字符串的開始位置。
$?????????????????? 匹配輸入字符串的結束位置。
[[:<:]] ???? ? ? ?? 詞的開始
[[:>:]] ??????????? 詞的結尾
.???????????????????? 匹配除 "\n" 之外的任何單個字符。要匹配包括 '\n' 在內的任何字符,請使用 '[.\n]' 的模式。
[...]???????????????? 字符集合。匹配所包含的任意一個字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^...]??????????????? 求否字符符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
p1|p2|p3??????? 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。
*????????????????????? 匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價于{0,}。
+???????????????????? 匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價于 {1,}。
{n}?????????????????? n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。
{n,m}??????????????? m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。
????????????????????????? 使用MySQL正則表達式
基本字符串匹配
SELECT prod_name FROM products WHERE prod_name REGEXP ‘1000’ ORDER BY prod_name;
檢索prod_name包含文本1000的所有行。除關鍵字LIKE被REGEXP替代外,這條語句看上去非常像使用LIKE的語句。它告訴MySQL: REGEXP后所跟的東西作為正則表達式(與文字正文1000匹配的一個正則表達式)處理。
SELECT prod_name FROM products WHERE prod_name REGEXP ‘.000’ ORDER BY prod_name;
正則中,.代表匹配任意一個字符。區分大小寫時:使用BINARY關鍵字
WHERE prod_name REGEXP BINARY ‘JetPack .000’;
進行OR匹配(使用‘|’)
SELECT prod_name FROM products WHERE prod_name REGEXP ‘1000|2000’ ORDER BY prod_name;
匹配幾個字符之一
用[和]括起來的字符完成
SELECT prod_name FROM products WHERE prod_name REGEXP ‘[123] Ton’ ORDER BY prod_name;
[]是另一種形式的OR語句。 事實上,正則表達式[123]Ton
為[1|2|3]Ton的縮寫,也可以使用后者。但是,需要用[]來定義OR語句查找什么。
SELECT prod_name FROM products WHERE prod_name REGEXP ‘1|2|3 Ton’ ORDER BY prod_name;
匹配范圍
下面的集合將匹配數字0到9:[0-9],a到z:[a-z]
SELECT prod_name FROM products WHERE prod_name REGEXP ‘[1-5] Ton’ ORDER BY prod_name;
匹配特殊字符
必須用\\為前導,\\-表示查找-,\\.表示查找.
SELECT vend_name FROM vendors WHERE vend_name REGEXP ‘\\.’ ORDER BY vend_name;
這種處理就是所謂的轉義( escaping),正則表達式內具有特殊意義的所有字符都必須以這種方式轉義。
匹配\ 為了匹配反斜杠( \)字符本身,需要使用\\\。
元 字 符 說 明
\\f??? ? ? ? 換頁
\\n ? ? ?? 換行
\\r??? ? ?? 回車
\\t??? ? ?? 制表
\\v ? ? ? 縱向制表