簡體   English   中英

如何插入/轉義正則表達式字符串以存儲在 jsonb 列中?

[英]How do I insert/escape a regex string to store in jsonb column?

我正在使用 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 中的這個正則表達式字符串?

我不知道您要求我們為您轉義的字符串是否已針對此介質正確轉義,因此我看到的字符串可能不是您想要的。 當我從屏幕上復制它時,我在它的中間得到了一些奇怪的回車之類的東西或其他非 ASCII 的東西,我把它刪除了。

假設您首先將字符串准確地轉換為 PostgreSQL 作為文本(為此我使用美元引用),那么 to_jsonb function 會將其轉換為正確轉義的 Z0ECD11C1D7A287421D148A23BBD7

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-]+)*$"

現在我不知道你看到的是否是我想讓你看到的,因為我可能需要轉義擒縱系統的 escaping,它可能一開始就被錯誤地轉義了。 但一般原則仍應適用。

查看您的關鍵字,似乎是您想通過 pgadmin 直接插入。 所以,PostgreSQL 有原生的 JSON 格式支持,我做了一個例子來說明如何使用它:

為了展示如何存儲 json 對象,請遵循一個虛擬表:

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

嘗試以基本方式即時檢查您的字符串。 我對 PostgreSQL 說轉換 json 中的字符串並訪問'title'屬性:

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

現在,嘗試使用您的 json(進行一些調整) - 反斜杠\和引號'在這里轉義:

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 轉換:

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

而且,我們完成了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM