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 是同义词。
- 正则表达式支持多种元字符,这些元字符在执行模式匹配时提供了更大的灵活性和控制力。
- 反斜杠在正则表达式中用作转义字符。只有在使用双反斜杠时,它才会被考虑在模式匹配中。
- 正则表达式不区分大小写。