在内容中搜索作为单数单词(而不是单词的一部分)中的散列标签,如下所示:
SELECT * FROM `messages` WHERE LOWER(`messages`.`content`) REGEXP '[[:<:]]#anxiety[[:>:]]'
它没有找到任何记录,但是搜索“焦虑”一词是有效的:
SELECT * FROM `messages` WHERE LOWER(`messages`.`content`) REGEXP '[[:<:]]anxiety[[:>:]]'
寻找诸如“她不喜欢雷雨。#焦虑#紧张”之类的信息。
不想匹配像"abc#anxiety“这样的单词的部分。它应该在“我有#焦虑”、“焦虑糟透了!”或“这就是#焦虑的样子”之前,将“#焦虑”与“##”匹配起来。
发布于 2022-07-22 16:34:00
我假设您使用的是MySQL 5.7,否则您的第一个查询也不会返回匹配。请参阅Regexp兼容性 8文档中的MySQL 8。
尽管如此,第二个查询不返回匹配,因为#
是一个非字母数字字符,而[[:<:]]
模式要求后面的字符是字母数字字符。所以这永远也比不上。事实上,仅仅存在#
前缀就可以确保这种“焦虑”并不是左侧单词匹配的一部分,所以您应该这样做:
SELECT * FROM `messages`
WHERE LOWER(`messages`.`content`) REGEXP '#anxiety[[:>:]]'
在一条评论中,您说abc#anxiety
不应该匹配(尽管从技术上讲,#
已经打断了一个单词)。在这种情况下:
SELECT * FROM `messages`
WHERE LOWER(`messages`.`content`) REGEXP '(^|[^a-zA-Z0-9_])#anxiety[[:>:]]'
在字符类[^a-zA-Z0-9_]
中,添加任何您不允许在#anxiety
之前使用的字符。
如果您的目的是在前面找到带有可选 #
的单词,那么使用前面的正则表达式并添加一个?
。
SELECT * FROM `messages`
WHERE LOWER(`messages`.`content`) REGEXP '(^|[^a-zA-Z0-9_])#?anxiety[[:>:]]'
https://stackoverflow.com/questions/73083408
复制相似问题