【问题标题】:How to use "#" symbol using a regular expression as a part of a whole word?如何使用正则表达式作为整个单词的一部分使用 \"#\" 符号?
【发布时间】:2022-08-05 03:30:09
【问题描述】:

在内容中搜索主题标签作为单数单词(不是单词的一部分)的一部分,如下所示:

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

它没有找到任何记录,但是搜索单词“anxiety”有效:

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

寻找类似“她不喜欢雷暴。#anxiety #nervous。”这样的消息

  • 请注意,mysql 在 mysql 8 中切换了正则表达式库,并且不再支持 :<: 语法。
  • select version(); 显示什么?
  • \"abc#anxiety\" 应该匹配吗?

标签: mysql regex


【解决方案1】:

我假设您在 MySQL 5.7 上工作,否则您的第一个查询也不会返回匹配项。请参阅 MySQL 8 文档中的 Regexp compatibility。

话虽如此,您的第二个查询不会返回匹配项,因为 # 是非字母数字字符,而 [[:&lt;:]] 模式要求后面的字符是字母数字字符。所以这永远不会匹配。事实上,# 前缀的存在已经保证了这种“焦虑”不是部分的单词匹配剩下一边,所以你应该这样做:

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

如果您的目的是找到带有可选的# 在它前面,然后使用|:

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

【讨论】:

  • 但大概他们也只想找到anxiety,而不是overanxiety。
  • 当缺少# 时,为什么它会匹配overanciety、@ysth?
  • 我的阅读是他们只想找到“anxiety”这个词的用途,但如果开头有一个#,也可以找到它。很明显他们不想要求一个 #
  • 那可能是,@ysth,但你对overanxiety 的引用是什么?我不明白。至于找到anxiety 或#anxiety,那么OR 作为where 子句或在正则表达式模式本身内部的问题。我在答案中添加了一个段落,其中包含使# 可选的模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多