在本教學中,您將學習如何使用MySQL REGEXP
運算符執行基於正則運算式的複雜搜索。
正則運算式簡介
正則運算式是描述搜索模式的特殊字串。 它是一個強大的工具,為您提供一種簡潔靈活的方法來識別基於模式的文本字元,例如字元,單詞等。
例如,可以使用正則運算式來搜索電子郵件,IP地址,電話號碼,社會安全號碼或具有特定模式的任何內容。
正則運算式使用其可以由正則運算式處理器解釋的自己的語法。 正則運算式廣泛應用於從編程語言到資料庫(包括MySQL)大部分平臺。
使用正則運算式的優點是,不限於在LIKE運算符中基於具有百分號(%
)和下劃線(_
)的固定模式搜索字串。 使用正則運算式,有更多的元字元來構造靈活的模式。
正則運算式的縮寫是regex
或regexp
。
MySQL REGEXP運算符
MySQL適應了Henry Spencer實現的正則運算式。MySQL允許使用REGEXP
運算符在SQL語句中匹配模式。
下麵說明了WHERE子句中REGEXP
運算符的語法:
SELECT
column_list
FROM
table_name
WHERE
string_column REGEXP pattern;
此語句執行string_column
與模式pattern
匹配。
如果string_column
中的值與模式pattern
匹配,則WHERE
子句中的運算式將返回1
,否則返回0
。
如果string_column
或pattern
為NULL
,則結果為NULL
。
除了REGEXP
運算符之外,可以使用RLIKE
運算符,這是REGEXP
運算符的同義詞。
REGEXP
運算符的否定形式是NOT REGEXP
。
MySQL REGEXP示例
假設想找出名字以字母A
,B
或C
開頭的產品。可以使用SELECT語句中的正則運算式如下:
SELECT
productname
FROM
products
WHERE
productname REGEXP '^(A|B|C)'
ORDER BY productname;
執行上面查詢語句,得到以下結果 -
+--------------------------------+
| productname |
+--------------------------------+
| America West Airlines B757-200 |
| American Airlines: B767-300 |
| American Airlines: MD-11S |
| ATA: B757-300 |
| Boeing X-32A JSF |
| Collectable Wooden Train |
| Corsair F4U ( Bird Cage) |
+--------------------------------+
7 rows in set
該模式允許查詢名稱以A
,B
或C
開頭的產品。
- 字元
^
表示從字串的開頭匹配。 - 字元
|
如果無法匹配,則搜索替代方法。
下表說明了正則運算式中一些常用的元字元和構造。
元字元 | 行為 |
---|---|
^ |
匹配搜索字串開頭處的位置 |
$ |
匹配搜索字串末尾的位置 |
. |
匹配任何單個字元 |
[…] |
匹配方括號內的任何字元 |
[^…] |
匹配方括號內未指定的任何字元 |
![]() |
匹配p1 或p2 模式 |
* |
匹配前面的字元零次或多次 |
+ |
匹配前一個字元一次或多次 |
{n} |
匹配前幾個字元的n 個實例 |
{m,n} |
從m 到n 個前一個字元的實例匹配 |
要查找名稱以a
開頭的產品,您可以在名稱開頭使用“^
”進行匹配,如下查詢語句:
SELECT
productname
FROM
products
WHERE
productname REGEXP '^a';
執行上面查詢語句,得到以下結果 -
+--------------------------------+
| productname |
+--------------------------------+
| American Airlines: B767-300 |
| America West Airlines B757-200 |
| ATA: B757-300 |
| American Airlines: MD-11S |
+--------------------------------+
4 rows in set
如果要使REGEXP
運算符以區分大小寫的方式比較字串,可以使用BINARY
運算符將字串轉換為二進位字串。
因為MySQL比較二進位位元組逐位元組而不是逐字元。 這允許字串比較區分大小寫。
例如,以下語句只匹配開頭為大寫“C
”的產品名稱。
SELECT
productname
FROM
products
WHERE
productname REGEXP BINARY '^C';
執行上面查詢語句,得到以下結果 -
+--------------------------+
| productname |
+--------------------------+
| Collectable Wooden Train |
| Corsair F4U ( Bird Cage) |
+--------------------------+
2 rows in set
要找到以f
結尾的產品,您可以使用’$f
‘來匹配字串的末尾。
SELECT
productname
FROM
products
WHERE
productname REGEXP 'f$';
執行上面查詢語句,得到以下結果 -
+------------------+
| productname |
+------------------+
| Boeing X-32A JSF |
+------------------+
1 row in set
要查找其名稱包含“ford
”的產品,請使用以下查詢:
SELECT
productname
FROM
products
WHERE
productname REGEXP 'ford';
執行上面查詢語句,得到以下結果 -
+----------------------------------+
| productname |
+----------------------------------+
| 1968 Ford Mustang |
| 1969 Ford Falcon |
| 1940 Ford Pickup Truck |
| 1911 Ford Town Car |
| 1932 Model A Ford J-Coupe |
| 1926 Ford Fire Engine |
| 1913 Ford Model T Speedster |
| 1934 Ford V8 Coupe |
| 1903 Ford Model A |
| 1976 Ford Gran Torino |
| 1940s Ford truck |
| 1957 Ford Thunderbird |
| 1912 Ford Model T Delivery Wagon |
| 1940 Ford Delivery Sedan |
| 1928 Ford Phaeton Deluxe |
+----------------------------------+
15 rows in set
要查找名稱只包含10
個字元的產品,可以使用’^
‘和’$
‘來匹配產品名稱的開頭和結尾,並重複{10}
次任何字元.
,作為以下查詢:
SELECT
productname
FROM
products
WHERE
productname REGEXP '^.{10}$';
執行上面查詢語句,得到以下結果 -
+-------------+
| productname |
+-------------+
| HMS Bounty |
| Pont Yacht |
+-------------+
2 rows in set
在本教學中,您已學習如何使用具有正則運算式的MySQL REGEXP
運算符查詢數據。