首页 > 解决方案 > 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]|$)' )

没有成功,所以我仍然卡住

标签: mysqlsqlregex

解决方案


您可以使用以下正则表达式:

SELECT * 
  FROM entries.qentries 
 WHERE (qWord REGEXP '^[^tT]*[tT]?[^tT]*$')

说明:

  • ^$开始和结束锚点(这是避免单词部分匹配所必需的)
  • [^tT]*任何不是 at或 a T0 次或多次的字符
  • [tT]?最多出现一次tor T(?等价于{0,1})
  • [^tT]*任何不是 at或 a T0 次或多次的字符

正则表达式演示

补充说明:

[^tT]此字符范围将接受任何不是 at或 a 的内容T(空格、.\n其他字符也将被接受,如果您只想接受字母并排除t,T您可以使用的:[a-su-zA-SU-Z],如果您想添加其他字符,则可以限制这一点到这个类,只需在最后添加它们[a-su-zA-SU-Z -]也将接受带有空格和-.


推荐阅读