使用 regexp_replace 替換字串周圍的單引號,但不在單字內,例如 can't

使用 regexp_replace 替換字串周圍的單引號,但不在單字內,例如 can't

我使用 bash 腳本中的以下程式碼將 postgres 資料庫中標題列中的單引號替換為空格。

psql -U postgres -d my_database -c "UPDATE my_table SET title = regexp_replace(title, '''', ' ', 'g')"

我的問題是我打算刪除字串周圍的單引號,例如,如下所示:

this is example 'number one' ok

變成

this is example  number one  ok 

這正如我所希望的那樣。

can't

變成

can t

如何指定我只想替換字串周圍的單引號。

答案1

我認為沒有什麼好的方法可以只用一種替換來做到這一點。但如果更換四次就可以了,請依照下列步驟操作:

  1. 替換\A'為 (即替換'字串的開頭)。

  2. 替換'\Z為 (即'在字串末尾替換)。

  3. 全域替換([^[:alnum:]])'為 \1(即將非字母數字字元 和 的每個序列替換'為非字母數字字元 和)。

  4. 全域替換'([^[:alnum:]])為 \1(即將'非字母數字字元的每個序列替換 為非字母數字字元。)

最終效果是替換'除前面的之外的所有內容後面跟著一個字母數字字元。

免責聲明:我對 PostgreSQL 一無所知;你必須自己將其翻譯成 PostgreSQL 文法。

答案2

使用更聰明的正規表示式:如果替換“ '”和“ '”(SPACE APOSTROPHEAPOSTROPHE SPACE),您將錯過單字內的撇號。

答案3

如果您想避免單字中出現撇號,請尋找左右沒有字母的撇號。尋找此類撇號的可能正規表示式可能是

([A-Za-z])\'([^A-Za-z])|([^A-Za-z])\'([A-Za-z])|([^A-Za-z])\'([^A-Za-z])

或更短

\'([^A-Za-z])|([^A-Za-z])\'

甚至更短

\'([^\w])|([^\w])\'

我猜 regexp_replace 會是

regexp_replace(title, '\'([^\w])|([^\w])\'', '\1', 'g')

我不熟悉 psql,所以正確的 synatx 可能是

regexp_replace(title, '''([^\w])|([^\w])''', '\1', 'g')

相關內容