首页 > 解决方案 > MySQL模式匹配以查找特定文本

问题描述

我的工作数据库来自网络论坛。在其中,有一个包含所有帖子数据的表格(即用户在线程中提交的文本)。这些帖子包含一个名为的列,该列message是帖子的实际内容。帖子可以包含任何字符以及表情符号。表情符号用冒号表示,紧随其后的是可变长度的简短描述,然后是冒号。即:clap:。一个帖子可以包含多个表情符号。

我正在尝试想出一种方法来拉出帖子表中所有表情符号的列表。

到目前为止,我所做的是一个查询,它会提取包含至少两个冒号的帖子列表:

SELECT 
    thread_id
    , post_id
    , SUBSTRING_INDEX(SUBSTRING_INDEX(message, ':', 2), ':', -1) 
FROM 
    xf_post
WHERE 
    ROUND((CHAR_LENGTH(message) - CHAR_LENGTH(REPLACE(message, ':', ""))) / CHAR_LENGTH(':')) > 1
LIMIT 50

这可行,但也会返回消息,其中用户出于任何原因包含多个冒号,例如random : text followed : by more text,或时间戳:00:00:12345

我希望实现的是返回所有出现在冒号之间的字母数字字符,没有任何空格。(是的,这将删除所有纯数字的表情符号,但是¯\_(ツ)_/¯)。

我摆弄了REGEXP,并想出了以下内容:[:][a-zA-Z]+(?=:)[:]根据regex101产生的正是我想要的。

我如何使用它来捕获输出,并且只查看分号之间的值,并且最好以这样的方式显示单个帖子中所有出现的笑脸?

谢谢你。

标签: mysqlregex

解决方案


@SimonlucaLandi 至少帮助我弄清楚了显示结果的方法。我的最终查询:

SELECT 
    thread_id
    , post_id
    , REGEXP_SUBSTR(message, '':[a-zA-Z]+:'')
FROM 
    xf_post
WHERE 
    message REGEXP '':[a-zA-Z]+:''
LIMIT 50

推荐阅读