MYSQL 正则表达式 (REGEXP) 及其语法和示例
什么是正则表达式?
正则表达式有助于搜索符合复杂条件的数据。我们在上一个教程中研究了通配符。如果您以前使用过通配符,您可能会问为什么要学习正则表达式,而使用通配符可以获得类似的结果。因为与通配符相比,正则表达式允许我们搜索符合更复杂条件的数据。
基本语法
正则表达式的基本语法如下
SELECT statements... WHERE fieldname REGEXP 'pattern';
这里 -
- “SELECT 语句…” 是标准 选择语句
- “WHERE 字段名称” 是要执行正则表达式的列的名称。
- “REGEXP‘模式’” 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 工作台 针对 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 charlist,看看执行查询后我们会得到什么结果。
SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';
在以下位置执行上述脚本 MySQL 针对 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 电影 WHERE 标题 REGEXP 'da*'; 将给出所有包含字符“da”的电影。例如,《达芬奇密码》、《爸爸的小女孩》。 | |
+ | 这个 加号(+) 元字符用于匹配其前面的一个或多个字符串实例。 | 从 `电影` 中选择 * 其中 `标题` REGEXP'mon+'; 将给出所有包含字符“mon”的电影。例如,《天使与魔鬼》。 | |
? | 问题(?) 元字符用于匹配其前面的字符串的零 (0) 个或一个实例。 | 从 `categories` 中选择 *,其中 `category_name` REGEXP'com?'; 将给出所有包含字符串 com 的类别。例如,喜剧、浪漫喜剧。 | |
. | 这个 点 (.) 元字符用于匹配除换行符之外的任何单个字符。 | 从电影中选择*其中`year_released` REGEXP'200。'; 将给出以字符“200”开头且后面跟着任意单个字符的年份上映的所有电影。例如,2005,2007,2008、XNUMX、XNUMX 等。 | |
[ABC] | 这个 字符列表 [abc] 用于匹配任意括起来的字符。 | 从 `电影` 中选择 * 其中 `标题` REGEXP '[vwxyz]'; 将给出包含“vwxyz”中任意单个角色的所有电影。例如,X战警,达芬奇密码等。 | |
[^abc] | 这个 字符列表 [^abc] 用于匹配除括号内的字符之外的任何字符。 | 从 `电影` 中选择 * 其中 `标题` REGEXP '^[^vwxyz]'; 将给出所有包含“vwxyz”中其他字符的电影。 | |
[AZ] | 这个 [AZ] 用于匹配任意大写字母。 | 从 `成员` 中选择 * 其中 `邮政地址` REGEXP '[AZ]'; 将给出所有邮政地址包含从 A 到 Z 的任意字符的会员。例如,会员编号为 1 的 Janet Jones。 | |
[az] | 这个 [az] 用于匹配任意小写字母 | 从 `成员` 中选择 * 其中 `邮政地址` REGEXP '[az]'; 将给出所有邮政地址包含从 a 到 z 的任意字符的会员。例如,会员编号为 1 的 Janet Jones。 | |
[0-9] | 这个 [0-9] 用于匹配从 0 到 9 的任意数字。 | 从 `成员` 中选择 *,其中 `联系人号码` REGEXP '[0-9]' 将给出所有提交了包含字符“[0-9]”的联系电话的会员,例如Robert Phil。 | |
^ | 这个 插入符号 (^) 用于在开始时启动比赛。 | 从 `电影` 中选择 * 其中 `标题` REGEXP '^[cd]'; 给出标题以“cd”中的任意字符开头的所有电影。例如,《Code Name Black》、《爸爸的小女孩》和《达芬奇密码》。 | |
| | 这个 竖线 (|) 用于隔离替代方案。 | 从 `电影` 中选择 * 其中 `标题` REGEXP '^[cd]|^[u]'; 给出标题以“cd”或“u”中任意字符开头的所有电影。例如,《代号黑色》、《爸爸的小女孩》、《达芬奇密码》和《黑夜传说》—— AwakenING。 | |
[[:<:]] | 这个[[:<:]] 匹配单词的开头。 | 从 `电影` 中选择 * 其中 `标题` REGEXP '[[:<:]]for';
给出所有以角色开头的电影。例如:忘掉莎拉·马歇尔。 |
|
[[:>:]] | 这个 [[:>:]] 匹配单词的结尾。 | 从 `电影` 中选择 * 其中 `标题` REGEXP'ack[[:>:]]';
给出所有以“ack”结尾的电影 .例如,代号黑色。 |
|
[:班级:] | 这个 [:班级:] 匹配一个字符类,即
[:α:] 匹配字母, [:空间:] 为了匹配空白, [:点:] 匹配标点符号,[:upper:] 匹配大写字母。 |
从 `电影` 中选择 * 其中 `标题` REGEXP '[:alpha:]';
给出所有片名仅包含字母的电影 .例如《忘掉莎拉·马歇尔》、《X战警》等等。 像《加勒比海盗 4》这样的电影将被此查询忽略。 |
反斜杠 (\) 用作转义字符。如果我们想将其用作正则表达式中模式的一部分,则应使用双反斜杠 (\\)
结语
- 正则表达式提供了强大而灵活的模式匹配,可以帮助我们为数据库系统实现强大的搜索功能。
- REGEXP 是执行正则表达式模式匹配时使用的运算符。RLIKE 是同义词
- 正则表达式支持许多元字符,从而允许在执行模式匹配时提供更多的灵活性和控制力。
- 反斜杠在正则表达式中用作转义字符。只有在使用双反斜杠时,才会在模式匹配中考虑它。
- 正则表达式不区分大小写。