【发布时间】:2019-05-13 03:35:23
【问题描述】:
我正在尝试使用 MySQL 正则表达式匹配不包含方括号的变量名。然而,当我写的东西包括:
[^[]]
MySQL 不执行匹配并在 Message 面板中返回 OK,表示查询尚未执行。
问题:如何在 MySQL 中否定方括号?
编辑:
我使用 MySQL 服务器 8.0.16 和 MySQL 工作台 8.0
【问题讨论】:
标签: mysql regex database regex-negation
我正在尝试使用 MySQL 正则表达式匹配不包含方括号的变量名。然而,当我写的东西包括:
[^[]]
MySQL 不执行匹配并在 Message 面板中返回 OK,表示查询尚未执行。
问题:如何在 MySQL 中否定方括号?
编辑:
我使用 MySQL 服务器 8.0.16 和 MySQL 工作台 8.0
【问题讨论】:
标签: mysql regex database regex-negation
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
MySQL 8+ 使用不同的正则表达式引擎(感谢@WiktorStribiżew),因此在这种情况下需要将正则表达式修改为[^]\\[](不转义[,MySQL 会抱怨“未闭合的括号表达式”)。这种形式的正则表达式在 MySQL 5.7 中也可以正常工作。
【讨论】:
[ 之后直接说 ],字面意思是 [^][] 并不真正在手册支持的范围内。
^[^][]+$ 应该可以工作,因为 ^ 并不是课堂上的真正角色。 MySQL 8 抱怨“未闭合的括号表达式”
[^][] 不是 ICU 正则表达式中的合法字符类,因为方括号用于形成字符类联合/交集,应该在字符类中转义。出于某种原因,ICU 开发人员没有为这些字符添加“智能放置”算法。
^[^\\]\\[]+$ 或 ^[^\\[\\]]+$ 不匹配任何字符串。
在您的查询中使用NOT:
看看这个:
SELECT * FROM test WHERE name NOT REGEXP "[\\[\\]]"
这部分查询是什么
REGEXP "[\\[\\]]"
意思是,选择所有包含[ 和] 的行。
但是,使用 not,实际上你是说选择所有不包含 [ 或 ] 的行;
【讨论】:
not regexp。