我有一个数据库表,其中包含字典中的单词。
现在我想选择字谜词。例如,如果我给出字符串SEPIAN
它应该获取像这样的值apes
, pain
, pains
, pies
, pines
, sepia
, etc.
为此,我使用了查询
SELECT * FROM words WHERE word REGEXP '^[SEPIAN]{1,6}$'
但这个查询返回这样的词anna
, essen
其中包含不在提供的字符串中的重复字符。例如。anna
有两个n
但只有一个n
在搜索字符串中SEPIAN
.
我该如何编写正则表达式来实现这一目标?此外,如果当时我的搜索字符串中有重复的字符,则重复的字符应该反映在结果中。
由于MySQL不支持反向引用捕获组,典型的解决方案是(\w).*\1
不管用。这意味着给出的任何解决方案都需要枚举所有可能的双精度数。此外,据我所知,反向引用在前向或后向中无效,并且 MySQL 不支持前向和后向。
但是,您可以将其拆分为两个表达式,并使用以下查询:
SELECT * FROM words
WHERE word REGEXP '^[SEPIAN]{1,6}$'
AND NOT word REGEXP 'S.*?S|E.*?E|P.*?P|I.*?I|A.*?A|N.*?N'
不太漂亮,但它可以工作,而且应该相当高效。
要支持重复字符的设定限制,请对辅助表达式使用以下模式:
A(.*?A){X,}
Where A
是你的性格并且X
是允许的次数。
所以如果你要添加另一个N
到你的字符串SEPIANN
(总共 2N
是),您的查询将变为:
SELECT * FROM words
WHERE word REGEXP '^[SEPIAN]{1,7}$'
AND NOT word REGEXP 'S.*?S|E.*?E|P.*?P|I.*?I|A.*?A|N(.*?N){2}'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)