MYSQL 正则表达式 (REGEXP) 语法与示例

什么是正则表达式?

正则表达式有助于搜索匹配复杂标准的(条件)数据。我们在上一教程中研究了通配符。如果您以前使用过通配符,您可能会问,既然可以使用通配符获得类似的结果,为什么还要学习正则表达式呢?因为与通配符相比,正则表达式使我们能够搜索匹配更复杂标准的(条件)数据。

基本语法

正则表达式的基本语法如下:

SELECT statements... WHERE fieldname REGEXP 'pattern';

此处 –

  • “SELECT 语句…” 是标准的 SELECT 语句
  • “WHERE fieldname” 是要对正则表达式执行操作的列名。
  • “REGEXP ‘pattern’” REGEXP 是正则表达式运算符,‘pattern’ 代表 REGEXP 要匹配的模式。 **RLIKE** 是 **REGEXP 的同义词**,并且可以获得与 REGEXP 相同的结果。为避免与 LIKE 运算符混淆,**最好使用 REGEXP**。

现在让我们看一个实际的例子:

SELECT * FROM `movies` WHERE `title` REGEXP 'code';

上述查询搜索所有包含“code”一词的电影标题。无论“code”是在标题的开头、中间还是结尾,都没有关系。只要它包含在标题中,它就会被考虑在内。

假设我们想搜索以 a、b、c 或 d 开头,后跟任意数量其他字符的电影,我们该如何实现?我们可以使用正则表达式和元字符来实现我们想要的结果。

SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';

MySQL workbench 中针对 myflixdb 执行上述脚本,会得到以下结果。

movie_id title director year_released category_id
4 Code Name Black Edgar Jimz 2010 NULL
5 Daddy's Little Girls NULL 2007 8
6 Angels and Demons NULL 2007 6
7 Davinci Code NULL 2007 6

现在让我们仔细看看负责上述结果的正则表达式。

‘^[abcd]’ 中的插入符 (^) 表示模式匹配应应用于开头,而字符集 [abcd] 表示只返回以 a、b、c 或 d 开头的电影标题。

让我们修改上述脚本并使用 NOT 字符集,看看执行查询后我们会得到什么结果。

SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';

在 MySQL Workbench 中针对 myflixdb 执行上述脚本会得到以下结果。

movie_id title director year_released category_id
1 Pirates of the Caribean 4 Rob Marshall 2011 1
2 Forgetting Sarah Marshal Nicholas Stoller 2008 2
3 X-Men 2008
9 Honey mooners John Schultz 2005 8
16 67% Guilty 2012
17 The Great Dictator Chalie Chaplie 1920 7
18 sample movie Anonymous 8
19 movie 3 John Brown 1920 8

现在让我们仔细看看负责上述结果的正则表达式。

‘^[^abcd]’ 中的插入符 (^) 表示模式匹配应应用于开头,而字符集 [^abcd] 表示排除以任何包含的字符开头的电影标题。

正则表达式元字符

我们在上面示例中看到的是最简单的正则表达式形式。现在让我们看一些更高级的正则表达式模式匹配。假设我们想仅使用正则表达式搜索以“code”模式开头的电影标题,我们该如何实现?答案是元字符。它们允许我们使用正则表达式对模式搜索结果进行微调。

字符 描述 示例
* **星号 (*)** 元字符用于匹配其前面的字符串零(0)次或多次出现。 SELECT * FROM movies WHERE title REGEXP ‘da*’; 将返回所有包含字符“da”的电影。例如:Da Vinci Code、Daddy’s Little Girls。
+ **加号 (+)** 元字符用于匹配其前面的字符串一次或多次出现。 SELECT * FROM `movies` WHERE `title` REGEXP ‘mon+’; 将返回所有包含字符“mon”的电影。例如:Angels and Demons。
? **问号 (?)** 元字符用于匹配其前面的字符串零(0)次或一次出现。 SELECT * FROM `categories` WHERE `category_name` REGEXP ‘com?’; 将返回所有包含字符串“com”的类别。例如:comedy(喜剧)、romantic comedy(浪漫喜剧)。
. **点 (.)** 元字符用于匹配除换行符外的任何单个字符。 SELECT * FROM movies WHERE `year_released` REGEXP ‘200.’; 将返回所有以“200”开头后跟任何单个字符的年份发行的电影。例如:2005、2007、2008 等。
[abc] **字符集 [abc]** 用于匹配任何包含的字符。 SELECT * FROM `movies` WHERE `title` REGEXP ‘[vwxyz]’; 将返回所有包含“vwxyz”中任何单个字符的电影。例如:X-Men、Da Vinci Code 等。
[^abc] **字符集 [^abc]** 用于匹配除包含的字符以外的任何字符。 SELECT * FROM `movies` WHERE `title` REGEXP ‘^[^vwxyz]’; 将返回所有包含“vwxyz”以外字符的电影。
[A-Z] **[A-Z]** 用于匹配任何大写字母。 SELECT * FROM `members` WHERE `postal_address` REGEXP ‘[A-Z]’; 将返回所有邮政地址包含从 A 到 Z 的任何字符的会员。例如:编号为 1 的会员 Janet Jones。
[a-z] **[a-z]** 用于匹配任何小写字母 SELECT * FROM `members` WHERE `postal_address` REGEXP ‘[a-z]’; 将返回所有邮政地址包含从 a 到 z 的任何字符的会员。例如:编号为 1 的会员 Janet Jones。
[0-9] **[0-9]** 用于匹配从 0 到 9 的任何数字。 SELECT * FROM `members` WHERE `contact_number` REGEXP ‘[0-9]’ 将返回所有提交了包含“[0-9]”字符的联系电话的会员。例如:Robert Phil。
^ **插入符 (^)** 用于在开头处开始匹配。 SELECT * FROM `movies` WHERE `title` REGEXP ‘^[cd]’; 返回所有标题以“cd”中的任何一个字符开头的电影。例如:Code Name Black、Daddy’s Little Girls 和 Da Vinci Code。
| **竖线 (|)** 用于隔离替代项。 SELECT * FROM `movies` WHERE `title` REGEXP ‘^[cd]|^[u]’; 返回所有标题以“cd”或“u”中的任何一个字符开头的电影。例如:Code Name Black、Daddy’s Little Girl、Da Vinci Code 和 Underworld – Awakening。
[[:<:]] **[[:<:]]** 匹配单词的开头。 SELECT * FROM `movies` WHERE `title` REGEXP ‘[[:<:]]for’;

返回所有标题以指定字符开头的电影。例如:Forgetting Sarah Marshal。

[[:>:]] **[[:>:]]** 匹配单词的结尾。 SELECT * FROM `movies` WHERE `title` REGEXP ‘ack[[:>:]]’;

返回所有标题以字符“ack”结尾的电影

例如:Code Name Black。

[:class:] **[:class:]** 匹配一个字符类,即:

[:alpha:] 匹配字母,[:space:] 匹配空格,[:punct:] 匹配标点符号,[:upper:] 匹配大写字母。

SELECT * FROM `movies` WHERE `title` REGEXP ‘[:alpha:]’;

返回所有标题仅包含字母的电影

例如:Forgetting Sarah Marshal、X-Men 等。

像 Pirates of the Caribbean 4 这样的电影将被此查询排除。

反斜杠 (\) 用作转义字符。如果我们要将其用作正则表达式中模式的一部分,我们应该使用双反斜杠 (\\)

摘要

  • 正则表达式提供了一种强大而灵活的模式匹配方式,可以帮助我们为数据库系统实现强大的搜索实用程序。
  • REGEXP 是执行正则表达式模式匹配时使用的运算符。RLIKE 是同义词。
  • 正则表达式支持多种元字符,这些元字符在执行模式匹配时提供了更大的灵活性和控制力。
  • 反斜杠在正则表达式中用作转义字符。只有在使用双反斜杠时,它才会被考虑在模式匹配中。
  • 正则表达式不区分大小写。