@givemoneybiatch
frontend

Почему вылетает ошибка «неверное регулярное выражение: 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

Из-за чего так?
  • Вопрос задан
  • 44 просмотра
Пригласить эксперта
Ответы на вопрос 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 думаю так же
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
Acme Crypto Corp Нижний Новгород
от 80 000 до 140 000 руб.
Cindx Москва
от 130 000 до 180 000 руб.
Acme Crypto Corp Нижний Новгород
от 50 000 руб.