MYSQL 正则表达式 (REGEXP) 及其语法和示例

什么是正则表达式?

正则表达式有助于搜索符合复杂条件的数据。我们在上一个教程中研究了通配符。如果您以前使用过通配符,您可能会问为什么要学习正则表达式,而使用通配符可以获得类似的结果。因为与通配符相比,正则表达式允许我们搜索符合更复杂条件的数据。

基本语法

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

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

这里 -

  • “SELECT 语句…” 是标准 选择语句
  • “WHERE 字段名称” 是要执行正则表达式的列的名称。
  • “REGEXP‘模式’” REGEXP 是正则表达式运算符,“pattern”表示 REGEXP 要匹配的模式。 RLIKEREGEXP 的同义词 并实现与 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 是同义词
  • 正则表达式支持许多元字符,从而允许在执行模式匹配时提供更多的灵活性和控制力。
  • 反斜杠在正则表达式中用作转义字符。只有在使用双反斜杠时,才会在模式匹配中考虑它。
  • 正则表达式不区分大小写。