MySQL REGEXP无法限制出现次数(?!)

时间:2018-06-11 00:36:55

标签: mysql sql regex

我的桌子里面有很多单词(列名'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]|$)' )

没有成功,所以我仍然坚持

1 个答案:

答案 0 :(得分:1)

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

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

<强>说明:

  • ^$开始和结束锚点(这是避免单词部分匹配所必需的)
  • [^tT]*任何非tT 0次或以上的字符
  • [tT]?最多出现一次tT?相当于{0,1}
  • [^tT]*任何非tT 0次或以上的字符

Regex Demo

附加说明:

[^tT]此字符范围将接受非tT的任何内容(空格,.\n,其他字符也将是如果您只想接受字母并排除t,T可以使用的[a-su-zA-SU-Z],则可以限制此项,如果您想在此类中添加其他字符,只需在末尾添加[a-su-zA-SU-Z -] - 1}}也会接受包含空格和Wire.write(readNDEFMsg, sizeof(readNDEFMsg));的单词。