MySQL REGEXP(或 RLIKE)支援 POSIX 正則表達式,比 LIKE 強大得多,可實現複雜模式匹配。本文系統梳理元字符、量詞、預定義字符類、定位符,並以 products 表為例演示。

WHERE prod_name REGEXP '1000':包含字面字符串 1000 的行。WHERE prod_name REGEXP '.000':. 匹配任意單字符,等效 _。

WHERE prod_name REGEXP '1000|2000|3000'
匹配包含 1000 或 2000 或 3000 的行。可鏈接任意多條件。

[123] 匹配 1、2、3 中任一。[1-5] 等價 [12345],範圍寫法。[0-9] 匹配任意數字。需求:匹配 1 Ton 或 2 Ton 或 3 Ton:
WHERE prod_name REGEXP '[123] Ton'
錯誤寫法:[1|2|3] Ton 會匹配字面字符 |。

| 元字符 | 含義 |
|---|---|
* | 0 次或多次 |
+ | 1 次或多次 |
? | 0 次或 1 次 |
{n} | 恰好 n 次 |
{n,} | 至少 n 次 |
{n,m} | n 到 m 次 |
示例:匹配右括號 + 數字 + 空格 + sticks + 可選左括號:
WHERE prod_name REGEXP '\\)[0-9] sticks\\('

| 類 | 等價 | 說明 |
|---|---|---|
[:alpha:] | [A-Za-z] | 字母 |
[:digit:] | [0-9] | 數字 |
[:alnum:] | [A-Za-z0-9] | 字母數字 |
[:lower:] | [a-z] | 小寫字母 |
[:upper:] | [A-Z] | 大寫字母 |
[:space:] | [ \t\r\n\v\f] | 空白字符 |
[:punct:] | 標點符號 | |
[:blank:] | [ \t] | 空格和製表符 |
[:cntrl:] | 控制字符 | |
[:graph:] | 可打印非空白 | |
[:print:] | 可打印含空白 |
查找產品名含連續 4 個數字:
WHERE prod_name REGEXP '[[:digit:]]{4}'

| 元字符 | 含義 |
|---|---|
^ | 字符串開頭 |
$ | 字符串結尾 |
[[:<:]] | 詞開頭 |
[[:>:]] | 詞結尾 |
查找以數字或點開頭的產品名:
WHERE prod_name REGEXP '^[0-9.]'

正則元字符(. * + ? ^ $ ( ) [ ] { } | \)需雙反斜杠轉義:\\.、\\*、\\\\。

REGEXP 無法使用索引,大表全掃描極慢。必要時改用全文索引或應用層預過濾。REGEXP_LIKE()、REGEXP_SUBSTR()、REGEXP_REPLACE(),功能更豐富。