@givemoneybiatch
Немного веб, немного гейм

Почему вылетает ошибка «неверное регулярное выражение: quantifier operand invalid»?

Всем привет. Есть таблица фильтров по книгам.
create table filter
(
  "id" serial PRIMARY KEY,
  "user_id" serial REFERENCES public.user (id) ON DELETE CASCADE,
  "keywords" text []
);

При добавлении новой книги в базу, идет поиск по уже существующим фильтрам и ключевым словам в них, чтобы уведомлять пользователя о новом поступлении.
Добавление книги. Используется pg-promise
self.create = function (obj) {
        return db.query(`INSERT INTO public.filter (user_id, keywords) 
        VALUES ($(userId), $(keywords)) RETURNING id;`, obj);
};

Поиск по ключевым словам выглядит примерно так. На вход у нас попадает строка(кусок текста)
SELECT * FROM public.filter WHERE
LOWER('Some long string from a book') ~ ANY(public.filter.keywords);

И если в фильтре в ключевых словах содержится какой-то специальный символ, например (c++), то вылетает ошибка
ERROR:  ОШИБКА:  неверное регулярное выражение: quantifier operand invalid

SQL state: 2201B

Из-за чего так?
  • Вопрос задан
  • 1026 просмотров
Пригласить эксперта
Ответы на вопрос 1
orlov0562
@orlov0562
I'm cool!
Попробуй экранировать спец символы (плюсы в слове "с++")

В справке MySQL есть пример:

To use a literal instance of a special character in a regular expression, precede it by two backslash (\) characters. The MySQL parser interprets one of the backslashes, and the regular expression library interprets the other. For example, to match the string 1+2 that contains the special + character, only the last of the following regular expressions is the correct one:
mysql> SELECT REGEXP_LIKE('1+2', '1+2');                       -> 0
mysql> SELECT REGEXP_LIKE('1+2', '1\+2');                      -> 0
mysql> SELECT REGEXP_LIKE('1+2', '1\\+2');                     -> 1


в postgre думаю так же
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы