Postgresデータベースのヘッダー列の一重引用符を空白に置き換えるには、bashスクリプトで次のコードを使用しています。
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
一回の代替だけでこれを行うための良い方法はないと思います。ただし、4回の交換で十分な場合は、次の手順に従ってください。
\A'
次に置き換えます(つまり、
'
文字列の先頭を置き換えます)。'\Z
次に、置換(つまり、
'
文字列の末尾で置換)。グローバルに次に
([^[:alnum:]])'
置き換えます\1
(つまり、英数字以外の文字sumのすべてのシーケンスを'
英数字以外の文字sumに置き換えます)。
'([^[: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')