MySQL REGEXP: Search Based On Regular Expressions

摘要在本教程中,您将学习如何使用 MySQL REGEXP 运算符基于正则表达式执行复杂的搜索。

正则表达式简介

正则表达式是描述搜索模式的特殊字符串。它是一个功能强大的工具,为您提供了一种简洁而灵活的方法来根据模式识别文本字符串,例如字符和单词。

例如,您可以使用正则表达式来搜索电子邮件、IP 地址、电话号码、社会安全号码或任何具有特定模式的内容。

正则表达式使用自己的语法,可以由正则表达式处理器解释。正则表达式广泛应用于从编程语言到包括 MySQL 在内的数据库的几乎所有平台。

使用正则表达式的优点是,您不限于根据LIKE运算符中的百分号 (%) 和下划线 (_) 的固定模式搜索字符串。正则表达式有更多的元字符来构造灵活的模式。

使用正则表达式的缺点是理解和维护如此复杂的模式相当困难。因此,您应该在SQL语句的注释中描述正则表达式的含义。此外,在某些情况下,如果在正则表达式中使用复杂模式,数据检索的速度会降低。

正则表达式的缩写是regex或regexp。

MySQL REGEXP 运算符

MySQL 采用了Henry Spencer实现的正则表达式。 MySQL 允许您使用REGEXP运算符直接匹配 SQL 语句中的模式。

下面说明了WHERE子句中REGEXP运算符的语法

SELECT 
    column_list
FROM
    table_name
WHERE
    string_column REGEXP pattern;Code language: SQL (Structured Query Language) (sql)

此语句执行string_columnpattern的模式匹配。

如果string_column中的值与pattern匹配,则WHERE子句中的表达式返回 true,否则返回 false。

如果string_columnpatternNULL ,则结果为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;Code language: SQL (Structured Query Language) (sql)

试试看

MySQL REGEXP 示例

该模式允许您查找名称以 A、B 或 C 开头的产品。

  • 字符^表示从字符串的开头开始匹配。
  • 人物|意思是如果无法匹配则寻找替代方案。

下表说明了正则表达式中的一些常用元字符和结构。

元字符行为
^匹配搜索字符串开头的位置
$匹配搜索字符串末尾的位置
匹配任何单个字符
[…]匹配方括号内指定的任何字符
[^…]匹配方括号内未指定的任何字符
p1|p2匹配任何模式 p1 或 p2
*匹配前面的字符零次或多次
+匹配前面的字符一次或多次
{n}匹配前一个字符的 n 个实例
{m,n}匹配前一个字符的 m 到 n 个实例

要查找名称以字符a开头的产品,请在名称开头使用元字符'^'进行匹配:

SELECT 
    productname
FROM
    products
WHERE
    productname REGEXP '^a';Code language: SQL (Structured Query Language) (sql)

试试看

MySQL REGEXP 正则表达式示例

如果您希望REGEXP运算符以区分大小写的方式比较字符串,则可以使用BINARY运算符将字符串转换为二进制字符串。

因为MySQL是逐字节比较二进制字符串而不是逐字符比较。这允许字符串比较区分大小写。

例如,以下语句仅匹配产品名称开头的大写"C"

SELECT 
    productname
FROM
    products
WHERE
    productname REGEXP BINARY '^C';Code language: SQL (Structured Query Language) (sql)

试试看

MySQL REGEXP 以 C 开头

要查找名称以 f 结尾的产品,可以使用'f$'来匹配字符串的结尾。

SELECT 
    productname
FROM
    products
WHERE
    productname REGEXP 'f$'Code language: SQL (Structured Query Language) (sql)

试试看

MySQL REGEXP ends with f

要查找名称中包含单词"ford"的产品,请使用以下查询:

SELECT 
    productname
FROM
    products
WHERE
    productname REGEXP 'ford';Code language: SQL (Structured Query Language) (sql)

试试看

MySQL REGEXP contains Ford

要查找名称恰好包含 10 个字符的产品,请使用“ ^'和“ $来匹配产品名称的开头和结尾,并重复任意字符“.” {10}.'介于两者之间,如以下查询所示:

SELECT 
    productname
FROM
    products
WHERE
    productname REGEXP '^.{10}$';Code language: SQL (Structured Query Language) (sql)

试试看

MySQL REGEXP 10 个字符

在本教程中,您学习了如何使用 MySQL REGEXP 运算符和正则表达式来查询数据。

本教程有帮助吗?