我正在尝试使用regex搜索一个示例短语:'@test123',例如:

SELECT (...) WHERE x RLIKE '[[:<:]]@test123[[:>:]]'

没有运气。可能单词边界选择器'[[:<:]]'不将“@”计算为单词。
如何实现?如何在MySQL regex中设置单词边界选择器,但有例外?

最佳答案

MySQL 5.7 Reference Manual / ... / Regular Expressions
[[::]]
这些标记代表单词边界。它们匹配开头
分别是词尾。一个单词是一系列单词字符
前面或后面没有单词字符的。一句话
字符是alnum类中的字母数字字符或
下划线(\u)。
所以,@是一个单词边界,而不是一个单词字符。我们还需要扩展“word characters”类以包含@。最简单的方法是直接枚举自定义单词字符:

SELECT * FROM
(
   SELECT '@test123'         AS x UNION ALL
   SELECT 'and @test123 too'      UNION ALL
   SELECT 'not@test123not'        UNION ALL
   SELECT 'not@test123'           UNION ALL
   SELECT '@test123not'           UNION ALL
   SELECT 'not @ test123'         UNION ALL
   SELECT 'test123'               UNION ALL
   SELECT '@west123'
) t
WHERE x RLIKE '([^a-z0-9_@]|^)@test123([^a-z0-9_@]|$)';

结果:
x
----------------
@test123
and @test123 too

07-26 02:11