MySQL REGEX:基於正規表示式的搜尋

2019-10-16 22:56:56

在本教學中,您將學習如何使用MySQL REGEXP運算子執行基於正規表示式的複雜搜尋。

正規表示式簡介

正規表示式是描述搜尋模式的特殊字串。 它是一個強大的工具,為您提供一種簡潔靈活的方法來識別基於模式的文字字元,例如字元,單詞等。

例如,可以使用正規表示式來搜尋電子郵件,IP地址,電話號碼,社會安全號碼或具有特定模式的任何內容。

正規表示式使用其可以由正規表示式處理器解釋的自己的語法。 正規表示式廣泛應用於從程式設計語言到資料庫(包括MySQL)大部分平台。

使用正規表示式的優點是,不限於在LIKE運算子中基於具有百分號(%)和下劃線(_)的固定模式搜尋字串。 使用正規表示式,有更多的元字元來構造靈活的模式。

正規表示式的縮寫是regexregexp

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_columnpatternNULL,則結果為NULL

除了REGEXP運算子之外,可以使用RLIKE運算子,這是REGEXP運算子的同義詞。

REGEXP運算子的否定形式是NOT REGEXP

 MySQL REGEXP範例

假設想找出名字以字母ABC開頭的產品。可以使用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

該模式允許查詢名稱以ABC開頭的產品。

  • 字元^表示從字串的開頭匹配。
  • 字元|如果無法匹配,則搜尋替代方法。

下表說明了正規表示式中一些常用的元字元和構造。

元字元 行為
^ 匹配搜尋字串開頭處的位置
$ 匹配搜尋字串末尾的位置
. 匹配任何單個字元
[…] 匹配方括號內的任何字元
[^…] 匹配方括號內未指定的任何字元
匹配p1p2模式
* 匹配前面的字元零次或多次
+ 匹配前一個字元一次或多次
{n} 匹配前幾個字元的n個範例
{m,n} mn個前一個字元的範例匹配

要查詢名稱以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運算子查詢資料。