Как отрицать квадратные скобки в регулярном выражении MySQL - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь сопоставить имя переменной, которая не содержит квадратных скобок, используя регулярное выражение MySQL. Однако когда я пишу что-то включает в себя:

[^[]]

MySQL не выполняет сопоставление и возвращает OK на панели сообщений, что означает, что запрос не был выполнен.

Вопрос: Как отрицать квадратные скобки в MySQL?

EDIT:

Я использую MysQL server 8.0.16 и MySQL workbench 8.0

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

MySQL5.x допускает ] в классе символов, только если это первый символ в классе (см. руководство ).Поэтому вам нужно переделать класс вашего персонажа как [^][].Например:

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

Демонстрация на dbfiddle

MySQL 8+ использует другой механизм регулярных выражений (спасибо @ WiktorStribiżew), поэтому в этом случае регулярное выражение необходимо изменить на [^]\\[] (без экранирования [ MySQL жалуется на «выражение с незакрытыми скобками»).Эта форма регулярного выражения также отлично работает в MySQL 5.7.

Демонстрация на dbfiddle

0 голосов
/ 13 мая 2019

Используйте NOT в своем запросе:

Посмотрите на это:

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

Что говорит эта часть запроса

REGEXP  "[\\[\\]]"

, выберите все строкикоторые содержат [ и ].

Но, используя not, фактически вы говорите, выберите все строки, которые не содержат [ или ];

...