Как вставить / экранировать строку регулярного выражения для хранения в столбце jsonb? - PullRequest
0 голосов
/ 25 апреля 2020

Я использую Postgres DB и у меня есть столбец JSONB. Я пытаюсь вставить узел json, который содержит регулярное выражение, только для целей хранения.

вот строка регулярного выражения (валидатор электронной почты):

^[A-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\.[A-Z0-9_!#$%&'*+/=?`{|}~^-]+↵)*@[A-Z0-9-]+(?:\.[A-Z0-9-]+)*$

Я пытаюсь вставьте это так

  {
     "title": "Testing",
     "myregex": "^[A-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\.[A-Z0-9_!#$%&'*+/=?`{|}~^-]+↵)*@[A-Z0-9-]+(?:\.[A- 
   Z0-9-]+)*$"
  }

Тем не менее, он продолжает выдавать ошибку. Как я могу избежать или иначе получить эту строку регулярного выражения, сохраненную в jsonb?

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

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

Предполагая, что вы ввели строку в PostgreSQL точно в первое место как текст (для которого я использую долларовые кавычки), затем функция to_jsonb преобразует его в правильно экранированный JSON

select to_jsonb($JJ$^[A-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\.[A-Z0-9_!#$%&'*+/=?`{|}~^-]+)*@[A-Z0-9-]+(?:\.[A-Z0-9-]+)*$$JJ$::text);
                                             to_jsonb                                              
---------------------------------------------------------------------------------------------------
 "^[A-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\\.[A-Z0-9_!#$%&'*+/=?`{|}~^-]+)*@[A-Z0-9-]+(?:\\.[A-Z0-9-]+)*$"

Теперь я не знаю, что вы видите, что я имел в виду Вы видите, потому что мне может понадобиться избежать выхода из спуска, который, во-первых, мог быть неправильно удален. Но общий принцип все еще должен применяться.

0 голосов
/ 25 апреля 2020

В ваших ключевых словах, кажется, вы хотите вставить напрямую через pgadmin. Итак, PostgreSQL имеет собственную поддержку формата JSON, я сделал пример того, как использовать это:

Чтобы показать, как вы можете хранить json объекты, следуйте фиктивной таблице:

$ CREATE TABLE test (id INT, data JSON, datab JSONB);
CREATE TABLE

Попытка проверить вашу строку на лету, в основном c способ. Я говорю PostgreSQL, чтобы преобразовать строку в json и получить доступ к свойству 'title':

test=# SELECT '{"title": "Testing"}'::json->'title';
 ?column?  
-----------
 "Testing"
(1 row)

Теперь попробуем с вашим json (с некоторыми изменениями) - Backsla sh \ и кавычка ' здесь экранируются:

test=# SELECT '{"title": "Testing","myregex": "^[A-Z0-9_!#$%&''*+/=?`{|}~^-]+(?:\\.[A-Z0-9_!#$%&''*+/=?`{|}~^-]+↵)*@[A-Z0-9-]+(?:\\.[A-Z0-9-]+)*$"}'::json->'myregex'
                                                              ?column?
----------------------------------------------------------------------------------------------------
 "^[A-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\\.[A-Z0-9_!#$%&'*+/=?`{|}~^-]+↵)*@[A-Z0-9-]+(?:\\.[A-Z0-9-]+)*$"
(1 row)

Итак, чтобы сохранить, просто выполните преобразование json с escape-строками:

test=# INSERT INTO test VALUES (1, '{"title": "Testing","myregex": "^[A-Z0-9_!#$%&''*+/=?`{|}~^-]+(?:\\.[A-Z0-9_!#$%&''*+/=?`{|}~^-]+↵)*@[A-Z0-9-]+(?:\\.[A-Z0-9-]+)*$"}'::json);
INSERT 1

И, мы закончили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...