MySQL如何使用正则查询 REGEXP高级模式匹配技巧

哎呀,你提到的 MySQL 正则表达式是我在一次活动中做过的事情。
当时有一个orders表,里面存储了用户填写的地址和各种东西。
我想找到所有包含“上海”一词的地址,但它们需要准确。
它们不能算作“上海路一号”,必须是纯粹的“上海”。
当时我想到使用REGEXP。

我写了命令 SELECT FROM 命令 WHERE REGEXP 地址“上海”但是发现不起作用。
许多带有“上海”字样的词语问世,如“上海路”、“上海大厦”等。
后来想了想,想加一个边框符号。
只需将其更改为 SELECT FROM order WHERE address REGEXP '^Shanghai$' 即可。
嘿,现在你可以找到一个干净的“上海”地址了。

但是后来我发现这个订单表里有几十万条数据。
当我运行这个查询时,速度非常慢。
背景卡了好久。
后来我变得更聪明,首先添加了一个条件,例如过滤省=“上海”,然后对该数据运行正常规则。
这是一个 SELECT FROM 订单,其中省份 = '上海' AND REGEXP 地址 '^上海$'。
这要快得多,因为需要过滤的数据要少得多。

还有一次,我创建了一个论坛,用户发布的消息包含我必须过滤掉的敏感词。
例如,“amazing”、“idiot”等。
我只是使用 NOT REGEXP,SELECT FROM messages,其中内容不是 REGEXP“Awesome|Stupid”。
发现过滤效果还可以,但性能也较差。
后来我老板说尝试全文索引并使用 MATCH...VS。
我吸取了教训,在内容字段上建立了全文索引,然后将查询更改为 SELECT FROM Messages WHERE MATCH(content) VS "+cool+stupid" IN BOOLEAN MODE。
速度快很多,过滤效果也相当好。

但是,REGEXP确实很灵活,但是也存在性能缺陷。
请小心,尤其是当数据量很大时。
有时候还是要考虑其他的解决方案,比如用程序来处理级别应用程序或使用专门的搜索引擎,例如 Elasticsearch。
这个东西搜索字符串的速度非常快。

哦,顺便说一下,你提到的转义字符我也有问题。
有一次匹配文件路径时,其中有一个反斜杠\。
我在正则表达式中写了路径REGEXP '\\\\',但结果根本不匹配。
后来查资料发现MySQL中字符串中的反斜杠需要转义,正则表达式也需要再次转义。
只需将其重写为路径 REGEXP 'ÿÿÿ',使用反斜杠的十六进制表示形式,然后解决它即可。

所以,REGEXP是个好东西,但是使用的时候要注意性能,不要盲目的处理几百万、几万的数据表。
面对复杂的需求时,多思考是否有其他、更快的方法。

MySQL如何定义REGEXP_MySQL正则表达式模式匹配教程

哎呀,我给你讲讲我当年踩到的陷阱吧。
MySQL正则表达式,我既爱又恨。

那年我在上海,有一个项目是处理用户填写的地址。
格式五花八门,乱七八糟。
我想使用正则表达式来选择一个带有数字后跟“XX路”或“XX街”的地址。
LIKE 根本不起作用。
我花了很长时间研究它并使用 REGEXP。
我写了REGEXP地址'(路|街)[0-9 ]+',一开始效果很好。
该表有数百条数据,几秒钟内即可得出结果。
结果老板说再加一个条件,必须是上海这个区的地址,而且必须用大写字母来匹配。
当时我很惊讶,所以我直接使用REGEXP BINARY添加了它。
猜猜发生了什么?以前都是秒出结果,但那天卡了快十分钟,扫描全表!然后,我想到在导入数据时,我也可以提取“区域”信息并将其存储在另一个字段中,建立索引并在查询时使用地址LIKE '%XX区域%',然后在结果集上使用REGEXP。
这更快。

其他时候在深圳,处理邮箱时,格式一定要匹配。
如果以@example.com结尾,则以字母开头,可以是字母、数字或中间的下划线。
我写了“^[a-zA-Z][a-zA-Z0-9 _]@example.com$”。
一开始我很高兴,但是我发现颜色和用户填充的颜色匹配,这使得孔不区分大小写。
然后改成REGEXP BINARY,就正确了。
还有一个转义字符。
我当时有一个同事写了“.+”来匹配任何字符,但结果是无声匹配,因为 .是正则表达式中的特殊字符,所以他必须写'\.',而且他漏了一个反斜杠,这让我摇头。

哦,顺便说一句,另一件事是,当正则表达式太复杂时,那就是一场噩梦。
到了杭州,就需要匹配各种复杂的身份证号码格式。
正则表达式就像圣经一样,有几十个字符,比如[0-9 ]{1 7 }([0-9 X])等等,看着就头疼。
结果查询速度非常慢,需要几分钟。
然后,我建议将它们分开,使用一些简单的 LIKES 来过滤明显的内容,然后使用 REGEXP,这会使事情变得更快。
而且你写完正则表达式之后一定要注释清楚,不然几个月后你就看不懂了,这就麻烦了。

总的来说,REGEXP是一个强大的工具,但是要使用好它,必须避免全表扫描,注意区分大小写和转义等小细节,避免写得太复杂并与其他功能一起优化。
这样既可以保证功能又不会减慢查询速度。

解密MySQL中强大的武器——REGEXP正则表达式

简单来说,MySQL中的REGEXP正则表达式其实非常简单。
它就像一把瑞士军刀,可以轻松处理复杂的字符串匹配和查找。
我们先来说说最重要的事情。
例如,在我们去年运行的一个项目中,我们使用 REGEXP 搜索了大约 3 000 条记录,每条记录的 file_path 字段均以“http://”开头,后跟数字或句点。

还有一件事:区分大小写是一个重要的细节。
默认情况下,REGEXP 是区分大小写的,所以一开始我以为无论大小写它都会匹配,但后来我发现这是不正确的。
这将是一个陷阱,特别是对于某些区分大小写的数据库应用程序。
等等,还有一件事。
如果您需要不区分大小写的匹配,则不需要 REGEXPBINARY。
只需直接在 COLLATE 子句中指定不区分大小写的排序规则即可。

一开始我以为正则表达式匹配的结果会直接返回匹配到的字符串,但实际上它返回的是一个布尔值,当你需要像AND或OR这样的布尔运算时,这特别有用。
很多人没有注意到这一点,但它可以让你编写更灵活的查询。

不过,说实话,还是挺难的。
使用 REGEXP 时,必须警惕正则表达式注入攻击。
此类攻击可能会危及数据库的安全。
因此,输入的数据必须经过严格的验证和过滤。

在性能方面,虽然REGEXP是一个强大的工具,但是复杂的正则表达式会导致查询性能不佳,尤其是在处理大规模数据时。
因此,在使用REGEXP时,必须权衡它带来的便利性和对性能的潜在影响。

最后,我认为学习和掌握正则表达式语法是值得尝试的。
MySQL 支持的正则表达式语法与许多其他编程语言类似,但也存在一些具体差异。
因此,使用时请联系官方MySQL 文档或相关资源是提高查询性能的关键。

关于mysql中使用正则表达式 REGEXP

MySQL正则匹配电话号码:
以1 3 :1 3 $结尾 匹配所有: . 对应1 5 .1 3 .1 8 开头:^(1 3 |1 5 |1 8 )。

搜索示例: sql 从用户中选择电话,其中电话 REGEXP '1 3 $';
方便的提醒:在生产中使用正则表达式之前对其进行测试。