我正在尝试使用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