首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么这个正则表达式适用于PHP测试,而不适用于MySQL?

为什么这个正则表达式适用于PHP测试,而不适用于MySQL?
EN

Stack Overflow用户
提问于 2018-07-05 04:30:02
回答 1查看 29关注 0票数 -1

我的列中有一个数据库:

  1. Sangles D ArrimageàCliquet
  2. sangle
  3. Passant sangle
    1. sangles (seule)
    2. Patins Glisseur Téflon angle
    3. Charnière d

如果我在https://regex101.com/中运行正则表达式^(.*\s)*(angles?)(\s.*)*$,并提出字符串列表,我会得到第5行和第6行的匹配,一切都是正常的。如果我运行正则表达式^(?:.*\s)*(sangles?)(?:\s.*)*$,我得到的匹配结果是第1,2,3,4行,也没问题。

现在,如果y将相同的正则表达式放入SQL请求(在phpmyadmin上):

SELECT * FROM magasin_article AS mag
WHERE mag_art_libelle REGEXP '^(.*\s)*(angles?)(\s.*)*$'

我得到了1,2,3,4行!

并通过请求:

SELECT * FROM magasin_article AS mag
WHERE mag_art_libelle REGEXP '^(.*\s)*(sangles?)(\s.*)*$'

我得到了结果1,2,4!

对此有什么合理的解释吗?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-05 08:22:06

MySQL (直到8.0?)有一个相当差劲的regexp解析器--几个反斜杠或环视操作符。MariaDB 10.0有一个更好的版本,可能可以处理您尝试的内容。

此外,MySQL的regexp只处理字节,不处理多字节字符。根据CHARACTER SETé可能是latin1十六进制E9或utf8十六进制C3 A9。后者会被错误地视为2个字符。

你想要什么?只有第5行和第6行?那么一行开头的angles如何呢?那Los Angles呢?(是的,拼写错误。)

获取5和6:REGEXP ' angle'

要添加行首:REGEXP '(^| )angle'

是的,在s?上添加将允许可选的复数。

此外,[[:<:]]sangle[[:>:]]会发现sangle是一个“单词”--即前后都有空格、字符串的开始/结束、标点符号等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51180416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档