MySQL模式匹配以查找特定文本

时间:2018-11-03 13:44:55

标签: mysql regex

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

我正在尝试提出一种方法,以提取posts表中所有表情符号的列表。

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

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产生了我想要的东西。

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

谢谢。

1 个答案:

答案 0 :(得分:0)

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

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