MYSQL--正则表达式

正则表达式的模式字符

在MySql中,使用REGEXP关键字来匹配查询正则表达式。形式如下:

  • 属性名 REGEXP ’ 匹配方式’
    “属性名”参数表示需要查询的字段的名称;“匹配方式”表示以哪种方式进行匹配查询。而“匹配方式”参数中是由很多的模式匹配的字符,他们代表不同意义。如下图:
    在这里插入图片描述
    下面介绍几种常用的正则表达式的查询方式:

查询以特定字符或字符串开头的记录

使用字符“ ^ ”可以匹配以特定字符或字符串开头的记录
示例:从test_book表email字段查询以‘L’开头的记录。

SQL代码:SELECT * FROM test_book WHERE eamil REGEXP '^L';

执行结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP '^L';
+-------+
| email |
+-------+
| Like  |
| Lay   |
+-------+
2 rows in set (0.00 sec)

示例:从test_book表email字段查询以‘aaa’开头的记录。

SQL代码:SELECT * FROM test_book WHERE eamil REGEXP '^aaa';

执行结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP '^aaa';
+--------------+
| email        |
+--------------+
| aaaokl       |
| aaaaaaokdnvh |
| aaa          |
+--------------+
3 rows in set (0.00 sec)

查询以特定字符或字符串结尾的记录

和上面查询特定开头一样,使用字符“$”,可以匹配以特定字符或字符串结尾的记录
示例:从test_book表email字段查询以‘c’结尾的记录。

SQL代码:SELECT * FROM test_book WHERE eamil REGEXP '^L..y';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP 'c$';
+---------+
| email   |
+---------+
| aaacccc |
| Eric    |
| bac     |
+---------+
3 rows in set (0.00 sec)

示例:从test_book表email字段查询以‘aaa’结尾的记录。

SQL代码:SELECT * FROM test_book WHERE eamil REGEXP 'aaa$';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP 'aaa$';
+-----------+
| email     |
+-----------+
| aaa       |
| okaassaaa |
| aaaaaaaa  |
+-----------+
3 rows in set (0.00 sec)

用符号“ . ”来替代字符串中的任意一个字符

使用正则表达式查询时,可以用“ . ”来替代字符串中的任意一个字符。
示例:从test_book表email字段查询以字母‘L’开头,以字母‘y’结尾,中间有两个任意字符的记录。

SQL代码:SELECT * FROM test_book WHERE eamil REGEXP 'L..y$';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP '^L..y$';
+-------+
| email |
+-------+
| Lucy  |
| Lily  |
+-------+
2 rows in set (0.00 sec)

匹配指定字符中的任意一个

使用方括号( [] )可以将需要查询的字符组成一个字符集。只要记录中包含方括号中的任意字符,该记录将会被查询出来。例如,通过“[abc]”可以查询包含a,b,c等3个字母中任何一个的记录。

示例:从test_book表email字段查询包含c,e和o3个字母中任意一个的记录。

SQL代码:SELECT * FROM test_book WHERE email REGEXP '[ceo]';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP '[ceo]';
+-------------------+
| email             |
+-------------------+
| 599749871@qq.com  |
| 599749871@163.com |
| 599749651@163.com |
| 5645ad4@163.cn    |
| Like              |
| aaaokl            |
| aaaaaaokdnvh      |
| aaacccc           |
| Eric              |
| bac               |
| okaassaaa         |
| Lucy              |
+-------------------+
12 rows in set (0.04 sec)

使用方括号([])可以指定集合的区间,如“[a-z]”表示从a到z的所有字母;同理,“[0-9]”表示从0到9的所有数字;“[a-z0-9]”表示包含所有小写字母和数字。

示例:从test_book表email字段查询包含数字的记录。

SQL代码:SELECT * FROM test_book WHERE email REGEXP '[0-9]';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP '[0-9]';
+-------------------+
| email             |
+-------------------+
| 599749871@qq.com  |
| 599749871@163.com |
| 599749651@163.com |
| 599749m           |
| 5645ad4@163.cn    |
| 18700780491       |
| 15934851251       |
+-------------------+
7 rows in set (0.00 sec)

示例:从test_book表email字段查询包含数字或字母a,b,c的记录。

SQL代码:SELECT * FROM test_book WHERE email REGEXP '[0-9a-c]';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP '[0-9a-c]';
+-------------------+
| email             |
+-------------------+
| 599749871@qq.com  |
| 599749871@163.com |
| 599749651@163.com |
| 599749m           |
| 5645ad4@163.cn    |
| 18700780491       |
| 15934851251       |
| Lay               |
| aaaokl            |
| aaaaaaokdnvh      |
| aaa               |
| aaacccc           |
| Eric              |
| bac               |
| okaassaaa         |
| aaaaaaaa          |
| Lucy              |
+-------------------+
17 rows in set (0.00 sec)

匹配指定字符以外的字符

使用“[^字符集合]”可以匹配指定字符以外的字符。

示例:从test_book表email字段查询包含数字和’a’到’w’以外的记录。

SQL代码:SELECT * FROM test_book WHERE email REGEXP '[^a-w0-9]';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP '[^0-9a-w]';
+-------------------+
| email             |
+-------------------+
| 599749871@qq.com  |
| 599749871@163.com |
| 599749651@163.com |
| 5645ad4@163.cn    |
| Lay               |
| Lucy              |
| Lily              |
| Ly                |
+-------------------+
8 rows in set (0.00 sec)

上面看到有几条邮箱数据包含数字也被查询出来,这是因为他们包含o,m字符,这是在a-w范围之外的,同理Lay因为包含L,y也被查询出来。

匹配指定字符串

正则表达式可以匹配字符串。当表中的记录包含这个字符串时,就可以将该记录查询出来。如果指定多个字符串,需要用符号“|”隔开。只要匹配这些字符串中的任意一个即可。

示例:从test_book表email字段查询包含’ic’的记录。

SQL代码:SELECT * FROM test_book WHERE email REGEXP 'ic';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP 'ic';
+-------+
| email |
+-------+
| Eric  |
| Alice |
| ice   |
+-------+
3 rows in set (0.00 sec)

示例:从test_book表email字段查询包含’ic’、‘uc’、‘ab’这三个字符串中任意一个的记录。

SQL代码:SELECT * FROM test_book WHERE email REGEXP 'ic|uc|ab';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP 'ic|uc|ab';
+-------+
| email |
+-------+
| Eric  |
| Lucy  |
| Alice |
| ice   |
+-------+
4 rows in set (0.00 sec)

使用“ * ”和“ + ”来匹配多个字符

正则表达式中,“ * ”和“ + ”都可以匹配多个该符号之前的字符。但是,”+”至少表示一个字符,而 "*"可以表示0个字符

示例:从test_book表email字段查询字母’c’之前出现过’a’的记录。

SQL代码:SELECT * FROM test_book WHERE email REGEXP 'a*c';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP 'a*c';
+-------------------+
| email             |
+-------------------+
| 599749871@qq.com  |
| 599749871@163.com |
| 599749651@163.com |
| 5645ad4@163.cn    |
| aaacccc           |
| Eric              |
| bac               |
| Lucy              |
| Alice             |
| ice               |
+-------------------+
10 rows in set (0.00 sec)

可以看到,这里有许多记录中字母c之前并没有a。因为“ * ”可以表示0个,所以这条语句表示的是c之前有0个或多个a出现;

如果使用“+” 应为下面这样

SQL代码:SELECT * FROM test_book WHERE email REGEXP 'a+c';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP 'a+c';
+---------+
| email   |
+---------+
| aaacccc |
| bac     |
+---------+
2 rows in set (0.00 sec)

这里结果就只剩下两条记录了。

使用{M}或者{M,N}来指定字符串连续出现的次数

正则表达式中,“字符串{M}”表示字符串连续出现M次;“字符串{M,N}”表示字符串连续出现至少M次,最多N次。例如,“ab{2}”表示“ab”连续出现两次。“ab{2,4}”表示字符串“ab”连续出现至少两次,最多四次。

示例:从test_book表email字段中查询出现过‘ab’3次的记录。

SQL代码:SELECT * FROM test_book WHERE eamil REGEXP 'ab{3}';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP '(ab){3}';
+------------------+
| email            |
+------------------+
| ababab           |
| abababab         |
| abababababababab |
+------------------+
3 rows in set (0.00 sec)

示例:从test_book表email字段中查询出现过‘ab’最少2次,最多8次的记录。

SQL代码:SELECT * FROM test_book WHERE eamil REGEXP 'ab{2,8}';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP '(ab){2,8}';
+------------------+
| email            |
+------------------+
| ababab           |
| abababab         |
| abababababababab |
+------------------+
3 rows in set (0.00 sec)

简单组合查询示例

我们先来看看测试表中的内容:

mysql> SELECT * FROM test_book ;
+-------------------+
| email             |
+-------------------+
| 599749871@qq.com  |
| 599749871@163.com |
| 599749651@163.com |
| 599749m           |
| 5645ad4@163.cn    |
| 18700780491       |
| 15934851251       |
| Like              |
| Lay               |
| aaaokl            |
| aaaaaaokdnvh      |
| aaa               |
| aaacccc           |
| Eric              |
| bac               |
| okaassaaa         |
| aaaaaaaa          |
| Lucy              |
| Lily              |
| Ly                |
| Alice             |
| ice               |
| ab                |
| ababab            |
| abababab          |
| abcdefg           |
| abababababababab  |
+-------------------+
27 rows in set (0.00 sec)
  • 示例:从test_book表中查询11位电话号码的记录记录。
SQL 代码:SELECT * FROM test_book WHERE email REGEXP '[0-9]{11}';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP '[0-9]{11}';
+-------------+
| email       |
+-------------+
| 18700780491 |
| 15934851251 |
+-------------+
2 rows in set (0.00 sec)
  • 示例:从test_book表中查询邮箱记录。
SQL 代码:SELECT * FROM test_book WHERE email REGEXP '[0-9a-z]@[0-9a-z]\.+[a-z]';

结果如下:

mysql> SELECT * FROM test_book WHERE email REGEXP '[0-9a-z]@[0-9a-z]\.+[a-z]';
+-------------------+
| email             |
+-------------------+
| 599749871@qq.com  |
| 599749871@163.com |
| 599749651@163.com |
| 5645ad4@163.cn    |
+-------------------+
4 rows in set (0.00 sec)

注意:上面我们在查询邮箱时使用到了“ . ”这个符号,在正则表达式中,这个符号释意为任何一个字符,所以当我们要表达“ . ”本身时,需要用到反斜杠转义字符“ \ ”。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

降温vae+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值