mysql - MySQL REGEXP 未能限制出现次数 (?!)
问题描述
我有一张表,里面有很多单独的单词(列名'qWord'),内容包括'Utility'、'Utter'、'Unicorn'和'Utile'
我正在尝试执行 SELECT 来查找最多包含一个字母“t”实例的 qWord 字符串。
使用 REGEXP 我认为这将是一个微不足道的声明,例如:
SELECT *
FROM entries.qentries
WHERE (qWord REGEXP 'T{0,1}')
但我仍然在输出中得到“Utter”和“Utility”——以及“Utile”和“Unicorn”。
那么我在这里错过了什么?
(FWIW:MySQL 8.0.11,在 Windows 8.1 机器上运行的社区版)
这是完整的 REGEXP,我很抱歉最初没有发布它。我正在寻找仅由特定字母组成的单词,并且该部分工作正常。
但我也用有限数量的给定字母的话,说t
SELECT * FROM entries.entries WHERE
(qWord NOT REGEXP 'C|F|G|I|J|K|P|Q|S|V|W|X|Y|Z|-')
AND (qWord REGEXP 'A|B|D|E|H|L|M|N|O|R|T|U')
AND (qWord REGEXP 't{0,1}') ;
我也试过(qWord REGEXP 't{0}|t{1}')
了(qWord REGEXP '(?<=[^t]|^)(t{0}|t{1})(?:[^t]|$)' )
没有成功,所以我仍然卡住
解决方案
您可以使用以下正则表达式:
SELECT *
FROM entries.qentries
WHERE (qWord REGEXP '^[^tT]*[tT]?[^tT]*$')
说明:
^
,$
开始和结束锚点(这是避免单词部分匹配所必需的)[^tT]*
任何不是 at
或 aT
0 次或多次的字符[tT]?
最多出现一次t
orT
(?
等价于{0,1}
)[^tT]*
任何不是 at
或 aT
0 次或多次的字符
补充说明:
[^tT]
此字符范围将接受任何不是 at
或 a 的内容T
(空格、.
和\n
其他字符也将被接受,如果您只想接受字母并排除t,T
您可以使用的:[a-su-zA-SU-Z]
,如果您想添加其他字符,则可以限制这一点到这个类,只需在最后添加它们[a-su-zA-SU-Z -]
也将接受带有空格和-
.
推荐阅读
- php - Laravel 6.0 - 自定义电子邮件验证:temporarySignedRoute() URL 不适用于新路由
- jakarta-ee - Bean Validation API 中 javax.validation.Payload 的用例是什么?
- sql - 获取特定用户组的下一个购买日期
- c - struct 中的指针放在两个 struct 成员上
- scala - 使用 Spark 高阶函数时如何返回案例类?
- java - 在 Java 中获取支持的 CPU 功能/指令
- amazon-web-services - AWS SNS 文本消息 (SMS) 无法发送消息
- javascript - 使用 setInterval 循环遍历数组不起作用
- android - BLE 配置无头设备和 OTA 的选择
- heroku - 降级 RabbitMq 的最安全方法