使用正则表达式进行MySQL子字符串匹配;子字符串包含'man'而不是'woman'。

3

我在使用正则表达式从数据库中获取数据时遇到了问题。当我在标签中搜索“man”时,它会返回包含“woman”的标签,因为它是子字符串。

SELECT '#hellowomanclothing' REGEXP '^(.)*[^wo]man(.)*$'; # returns 0 correct, it contains 'woman'
SELECT '#helloowmanclothing' REGEXP '^(.)*[^wo]man(.)*$'; # returns 0 incorrect, it can contain anything other than 'woman' 
SELECT '#stylemanclothing' REGEXP '^(.)*[^wo]man(.)*$'; # returns 1 correct

当我搜索“man”时,如何更新正则表达式,使其仅返回包含“man”而不是“woman”的标签?


顺便提一下,不要写 (.)*(这没有意义),而是直接写 .* - Casimir et Hippolyte
好的,它也可以工作!谢谢。 - San
3个回答

3
您可以使用两个表达式。我认为like已经足够了:
SELECT ('#stylemanclothing' like '%man%' and '#stylemanclothing' not like '%woman%')

虽然你可以用正则表达式表达这个,但这可能是更容易的解决方案。


3
请使用以下内容:
SELECT '#helloowmanclothing' REGEXP '^(.)*([^o]|[^w]o)man(.)*$'

在您的模式中,[^wo]代表“除了w和o之外的一个字符”,而您需要排除两个连续的字符-w和o。
因此,上述模式仅允许在o之前有w以外的字符出现时,o可以在man之前出现。

这里,其他以w或o结尾的单词在“man”之前都会失败。SELECT '#hellomanclothing' REGEXP '^(.)[^w][^o]man(.)$' - San
@San 你是对的,我已经纠正了,可以看看我的编辑后的答案。 - n-dru
太好了!非常感谢你! :-) - San
为什么 SELECT 'manclothing' REGEXP '^(.)([^o]|[^w]o)man(.)$' 返回值是0?它应该返回1。 - San

1

这是一种n-dru模式的变体,因为您不需要描述所有字符串:

SELECT '#hellowomanclothing' REGEXP '(^#.|[^o]|[^w]o)man';

注意:如果一个标签包含'man'和'woman',这个模式将返回1。如果你不想要这个结果,那么Gordon Linoff的解决方案就是你所需要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接