【问题标题】:How to negate square brackets in MySQL regex如何在 MySQL 正则表达式中否定方括号
【发布时间】:2019-05-13 03:35:23
【问题描述】:

我正在尝试使用 MySQL 正则表达式匹配不包含方括号的变量名。然而,当我写的东西包括:

[^[]]

MySQL 不执行匹配并在 Message 面板中返回 OK,表示查询尚未执行。

问题:如何在 MySQL 中否定方括号?

编辑:

我使用 MySQL 服务器 8.0.16 和 MySQL 工作台 8.0

【问题讨论】:

    标签: mysql regex database regex-negation


    【解决方案1】:

    MySQL5.x 仅允许 ] 在字符类中,如果它是类中的 第一个 字符(参见 manual)。所以你需要把你的角色类改成[^][]。例如:

    CREATE TABLE vars (varname VARCHAR(20));
    INSERT INTO vars VALUES
    ('hello world'),
    ('hello [world'),
    ('hello world]'),
    ('hello [world]');
    SELECT varname, varname RLIKE '^[^][]+$' AS `match`
    FROM vars
    

    输出:

    varname         match
    hello world     1
    hello [world    0
    hello world]    0
    hello [world]   0
    

    Demo on dbfiddle

    MySQL 8+ 使用不同的正则表达式引擎(感谢@WiktorStribiżew),因此在这种情况下需要将正则表达式修改为[^]\\[](不转义[,MySQL 会抱怨“未闭合的括号表达式”)。这种形式的正则表达式在 MySQL 5.7 中也可以正常工作。

    Demo on dbfiddle

    【讨论】:

    • 好答案,不同的行为似乎值得bug report (但是我还没有找到现有的)。从技术上讲,手册在开始 [ 之后直接说 ],字面意思是 [^][] 并不真正在手册支持的范围内。
    • @danblack 你可能是对的。 IMO 正则表达式 ^[^][]+$ 应该可以工作,因为 ^ 并不是课堂上的真正角色。 MySQL 8 抱怨“未闭合的括号表达式”
    • @danblack 很遗憾,如果没有 Oracle 帐户,我无法报告错误。
    • [^][] 不是 ICU 正则表达式中的合法字符类,因为方括号用于形成字符类联合/交集,应该在字符类中转义。出于某种原因,ICU 开发人员没有为这些字符添加“智能放置”算法。
    • @WiktorStribiżew 所以你认为 MySQL 5.7 正确处理该类实际上是不正确的行为吗?这似乎是 MySQL 5.7 中唯一可行的方法;使用 ^[^\\]\\[]+$^[^\\[\\]]+$ 不匹配任何字符串。
    【解决方案2】:

    在您的查询中使用NOT

    看看这个:

    SELECT * FROM test WHERE name NOT REGEXP  "[\\[\\]]"
    

    这部分查询是什么

    REGEXP  "[\\[\\]]"
    

    意思是,选择所有包含[] 的行。

    但是,使用 not,实际上你是说选择所有不包含 [] 的行;

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多