使用 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')

相关内容