
本文主要介绍如何使用正则表达式在Mysql中进行搜索.
正则表达式是一个非常大的内容,我将在以后写博客介绍,这里只是一些常见匹配模式的简要介绍
博客帖子地址:
前面的文章介绍了各种过滤数据条件. 通过这些条件,我们已经能够满足日常开发中的大部分工作. 但是,假设过滤条件要复杂一些. 例如,您的老板告诉您从邮箱+手机号码的混合用户中找出注册手机号码的用户正则表达式怎么使用,然后向他们发送营销短信. 此时,以前的过滤方法不是很有效. 正则表达式搜索非常方便.
简单来说,正则表达式是用于匹配文本的特殊字符串. 例如,从文本中提取电话号码,带数字的用户名或以特定格式提取文本.
所有语言编辑器基本上都支持正则表达式. 我必须说,正则表达式已成为开发过程中的强大工具. Mysql也不例外,因此开始正式学习这种特殊的匹配方法.
本文末尾的附录中提供了本文中使用的Mysql表.
匹配字符串是正则表达式的最基本应用. 我们先举个例子: 我们从用户表中查找名称中包含100位数字的用户
SELECT * FROM my_user WHERE `name` REGEXP '100';
我们获得了用户ID为1的用户: 小红100
此语句与之前的语句不同,我们使用REGEXP关键字表示后面的正则表达式
此语句看起来特别类似于LIKE语句,也可以使用LIKE语句实现. 使用正则表达式有什么意义?
原因很简单. 假设我现在不仅需要匹配100位用户,还需要匹配100、200或300,只要它们都是100. 换句话说,无论数字是多少,我都需要包含数字的所有名称. 然后使用LIKE来实现它非常困难. 正则表达式将非常简单.
SELECT * FROM my_user WHERE `name` REGEXP '.00'; // 匹配包含整百的名字,如100,200,300等等
表达式.00中的点代表任何字符. 也就是说,无论是1还是2或9,或者任何字母都可以匹配,任何字母都可以匹配.
SELECT * FROM my_user WHERE `name` REGEXP '[0-9]'; // 匹配所有名字里面包含数字的用户
它比LIKE容易吗?上面的表达式将在下一步中详细说明.
那么我们什么时候应该使用LIKE?什么时候使用正则表达式查询合适?
在这里,我们只需要记住LIKE查询和常规查询之间非常重要的区别.
首先看两个例子:
1. 以前的声明
SELECT * FROM my_user WHERE `name` REGEXP '100';

2. LIKE查询的实现
SELECT * FROM my_user WHERE `name` LIKE '100';
在这里我们可以清楚地看到两者之间的区别: 正则表达式返回一条记录,而LIKE查询与任何记录都不匹配
结论: LIKE查询与整个列匹配. 如果该列中包含要匹配的字符串(例如,上面的100),则匹配不会成功. 常规匹配可以匹配列值内的值. 简而言之,它将从第一个字符向后匹配. 只要有匹配项,它将返回记录. 这是两者之间的重要区别.
当然,常规匹配是否也可以匹配整个字符. 但是,还需要其他知识: 定位符^和$,将在下面进行详细说明.
如果正则表达式与LIKE略有不同,它将不会具有很高的地位. 以下是展示技能的时间.
或查询也称为OR查询,这是条件并行查询的一种情况. 类似于编程语言中的其他条件,只要满足条件,它就会被匹配.
SELECT * FROM my_user WHERE `name` REGEXP '100|200';
上面的语句查询名称包含100或200位数字的用户正则表达式怎么使用,这意味着只要两个值匹配一个,就可以返回数据.
当然,您也可以给出一个或多个情况,只需使用垂直线将它们分开即可. 例如: 100 | 200 | 300 | 400
使用或查询的情况与在SELECT中使用OR条件连接的情况有点相似. 您可以将它们视为包含正则表达式.
常规匹配中有一个特殊的OR匹配.
SELECT * FROM my_user WHERE `name` REGEXP '[12]';
在上面的表达式中,我们使用了特殊的字符串[12]. 该字符串的含义是: 查询名称包含数字1或数字2的记录,这是[1 |的缩写. 2].
这样,无论方括号中有多少个字符串,使用方括号将字符串括起来,表达式的含义就是匹配其中的任何一个.
如果为[123456789],则表示它匹配名称包含1或2或3或4或5或6或7或8或9的任何记录.
当然,该字符串也可以用于查询被拒绝的情况. [^ 12]如果在12之前添加^符号,则表示字符串不是1或2.
SELECT * FROM my_user WHERE `name` REGEXP '[^12]';
说明: 尽管表中的小红色100包含1,但它包含0. 0不属于1或2,因此它是匹配的.
看,我们上面有一个集合[123456789]. 如果我们每次写常规文本时都写这个,那不会很麻烦. 因此,我们可以简化这种情况,并使用范围[1-9]代替此字符串字符串. 如果它与所有数字都匹配,那么它将包含0,我们可以使用[0-9]来表示.
SELECT * FROM my_user WHERE `name` REGEXP '[0-9]';

此表达式将匹配名称包含数字的所有记录. 反汇编应理解为包括0或1或2 ...或8或9条记录.
此不仅是数字,而且是字母. 例如,[a-z]表示从字母a到字母z的所有数字,即26个字母. 小写字母已完成,还有一个大写字母[A-Z]. 然后我们将其放在一起[0-9a-zA-Z]这个表达式非常强大,可以表示包含数字,小写字母和大写字母的所有记录.
SELECT * FROM my_user WHERE `name` REGEXP '[0-9a-zA-Z]';
由于我的名字中没有字母,所以结果与上面的[0-9]相同.
让我们看一下以下语句:
SELECT * FROM my_user WHERE `name` REGEXP '[0-9]';
此语句表示匹配名称包含所有数字的记录. 0-9用方括号扩展,所以如果我现在需要匹配方宽度怎么办?
这时,需要匹配特殊字符的知识. 为了匹配这些特殊字符,我们需要使用转义功能,即以(双反斜杠)为开头. 假设我们需要匹配常见的特殊字符,我们可以这样写:
\\[ 匹配左方括号
\\. 匹配点号
\\] 匹配右方括号
\\| 匹配竖线
\\\ 匹配反斜杠自己本身
反过来,其他特殊字符串也可以用这种方式处理.
双反斜杠加上一些字母也可以表示特殊含义.
例如:
\\f 换页
\\n 换行
\\r 回车
\\t 制表符
\\v 纵向制表符
在通用编程语言中,转义通常使用反斜杠,为什么在Mysql中使用两个反斜杠?原因是: Mysql需要一个来标识自己,然后Mysql会将由反斜杠扣除的其余部分完全移交给正则表达式库进行解释,因此总数为两个.
尽管正则表达式为长表达式提供了一些缩写,例如数字为[0-9]. [a-z]表示小写字母. 但是,有时候感觉很复杂. 因此,正则表达式还提供了一些预定义的字符类,以方便我们的开发.
简而言之,就像车牌使用Su代表江苏和上海代表上海.
我们直接参考表格.
类说明
[: alnum: ]
任何数字和字母. 等效于[a-zA-Z0-9]
[: alpha: ]
任何字符. 等效于[a-zA-z]
[: 空白: ]
空格和列表. 等效于[(双斜杠,segmentfault,此处不能显示双斜杠)t]

[: cntrl: ]
ASCII控制字符(ASCII 0到31和127)
[: 数字: ]
任何号码. 相当于[0-9]
[: 图: ]
与[: print: ]相同,但没有空格
[: 较低: ]
任何小写字母. 等效于[a-z]
[: 打印: ]
任何可打印的字符
[: punct: ]
不在[: alnum: ]和[: cntrl: ]中的任何字符
[: 空格: ]
任何空白字符,包括空格.
[: 上层: ]
任何大写字母. 等同于[A-Z]
[: xdigit: ]
任何十六进制数. 等效于[a-fA-F0-9]
以前的匹配项都是单词匹配项. 即,如果匹配一次,则显示它,如果不匹配,则不显示它. 但是,复杂的情况有时需要多次匹配. 假设我需要匹配名称中包含2-3位数字的记录. 此时,您需要使用特殊的元字符进行修改.
SELECT * FROM my_user WHERE `name` REGEXP '[0-9]{2,3}';
这很简单吗?具体用法如下.
取出此特殊字符串[0-9] {2,3},并删除前一个[0-9]之后的{2,3},以使其成为重复的元字符. 重复一定次数.
元字符的作用
重复0次或更多次
重复一次或多次. 等效于{1,}

重复0次或1次
重复n次
重复至少n次
{n,m}
重复n-m次
SELECT * FROM my_user WHERE `name` REGEXP '[0-9]*'; // 匹配名字包含或者不包含数字的记录
SELECT * FROM my_user WHERE `name` REGEXP '[0-9]{2,3}'; // 匹配名字内包含2位数或者3位数的记录
除了之前重复的元字符之外,常规规则还具有特殊的定位元字符
元字符的作用
文本开头
文字结尾
[[:::]]
单词的开头
[[:::]]
字尾
还记得前面的示例,该示例将LIKE与正则表达式区分开了吗? LIKE是用来匹配整个字符串,而regular是用来匹配.
如果现在需要在邮箱+手机号码的混合帐户中选择一个手机号码,那么我们必须从头到尾匹配该帐户.
例如,手机号码为11位数字,表示a11111111111不好,但他有11位数字.
所以我们需要从头到尾进行匹配,这是11位数字.
SELECT * FROM my_user WHERE `name` REGEXP '^[0-9]{11}$';
为了匹配内容,我在中添加了另一条记录.
匹配结果
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for my_user
-- ----------------------------
DROP TABLE IF EXISTS `my_user`;
CREATE TABLE `my_user` (
`user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`age` tinyint(2) NOT NULL DEFAULT '0',
`password` varchar(40) NOT NULL,
`code` varchar(10) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of my_user
-- ----------------------------
INSERT INTO `my_user` VALUES ('1', '小红100', '20', '7a8d09ca3762af61e59520943dc26494f8941b', '2arfs5dr6m');
INSERT INTO `my_user` VALUES ('2', '小明200', '19', '7a8d09ca3762af61e59520943dc26494f8941b', 'd59tg6dr5h');
INSERT INTO `my_user` VALUES ('3', '小黄350', '25', '7a8d09ca3762af61e59520943dc26494f8941b', 'w56tg9hjn3');
INSERT INTO `my_user` VALUES ('4', '小颖410', '25', '7a8d09ca3762af61e59520943dc26494f8941b', 'a5d23e9yh5');
INSERT INTO `my_user` VALUES ('5', '星空幻颖', '22', '7a8d09ca3762af61e59520943dc26494f8941b', '86d2sadft9');
繁星之夜,艳影
个人主页: segmentfault
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-224279-1.html
维护巴拿马主权
更新换代周期一般是多少年