如何否定 MySQL 正则表达式中的方括号
How to negate square brackets in MySQL regex
我正在尝试使用 MySQL 正则表达式匹配不包含方括号的变量名称。但是当我写一些东西时包括:
[^[]]
MySQL不执行匹配,消息面板returnsOK,表示查询未执行。
问题:如何取反MySQL中的方括号?
编辑:
我使用 MysQL 服务器 8.0.16 和 MySQL workbench 8.0
在您的查询中使用 NOT
:
看看这个:
SELECT * FROM test WHERE name NOT REGEXP "[\[\]]"
这部分查询什么
REGEXP "[\[\]]"
表示,select 所有包含 [
和 ]
的行。
但是,使用 not,实际上你是在说 select 所有不包含 [
或 ]
的行;
MySQL5.x 只允许字符 class 中出现 ]
,如果它是 class 中的 第一个 字符(参见manual)。所以你需要把你的角色 class 重做成 [^][]
。例如:
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 抱怨 "unclosed bracket expression")。这种形式的正则表达式在 MySQL 5.7.
中也能正常工作
我正在尝试使用 MySQL 正则表达式匹配不包含方括号的变量名称。但是当我写一些东西时包括:
[^[]]
MySQL不执行匹配,消息面板returnsOK,表示查询未执行。
问题:如何取反MySQL中的方括号?
编辑:
我使用 MysQL 服务器 8.0.16 和 MySQL workbench 8.0
在您的查询中使用 NOT
:
看看这个:
SELECT * FROM test WHERE name NOT REGEXP "[\[\]]"
这部分查询什么
REGEXP "[\[\]]"
表示,select 所有包含 [
和 ]
的行。
但是,使用 not,实际上你是在说 select 所有不包含 [
或 ]
的行;
MySQL5.x 只允许字符 class 中出现 ]
,如果它是 class 中的 第一个 字符(参见manual)。所以你需要把你的角色 class 重做成 [^][]
。例如:
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 抱怨 "unclosed bracket expression")。这种形式的正则表达式在 MySQL 5.7.