如何使用正则表达式作为整个单词的一部分使用"#"符号?



在内容中搜索作为单数单词(而不是单词的一部分(的标签,如:

SELECT * FROM `messages` WHERE LOWER(`messages`.`content`) REGEXP '[[:<:]]#anxiety[[:>:]]'

它没有找到任何记录,但搜索了单词";焦虑;作品:

SELECT * FROM `messages` WHERE LOWER(`messages`.`content`) REGEXP '[[:<:]]anxiety[[:>:]]'

正在查找类似";她不喜欢雷雨#焦虑#紧张">

不希望匹配单词的部分,如";abc"焦虑";。它应该匹配"#焦虑;作为一个独立的单词#"在它喜欢";我有"焦虑症"焦虑糟透了&";,或";这就是#焦虑症的样子&";。

我假设您使用MySQL 5.7,否则您的第一个查询也不会返回匹配项。请参阅MySQL 8文档中的Regexp兼容性。

话虽如此,您的第二个查询不会返回匹配项,因为#是非字母数字字符,而[[:<:]]模式要求后面的字符是字母数字字符。所以这永远不会匹配。事实上,仅仅#前缀的存在就已经确保了该";焦虑;不是左侧单词匹配的部分,所以你应该这样做:

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[[:>:]]'

相关内容

最新更新