我使用 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
我认为没有什么好的方法可以只用一种替换来做到这一点。但如果更换四次就可以了,请按以下步骤操作:
替换
\A'
为(即替换
'
字符串的开头)。替换
'\Z
为(即
'
在字符串末尾替换)。全局替换
([^[:alnum:]])'
为\1
(即将非字母数字字符 和 的每个序列替换'
为非字母数字字符 和)。
全局替换
'([^[:alnum:]])
为\1
(即将'
非字母数字字符的每个序列替换为非字母数字字符。)
最终效果是替换'
除前面的之外的所有内容和后跟一个字母数字字符。
免责声明:我对 PostgreSQL 一无所知;您必须自己将其翻译成 PostgreSQL 语法。
答案2
使用更聪明的正则表达式:如果替换“ '
”和“ '
”(SPACE APOSTROPHE和APOSTROPHE 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')