regexp_replaceを使用して文字列を囲む単一引用符を置換しますが、単語内は置換しません。

regexp_replaceを使用して文字列を囲む単一引用符を置換しますが、単語内は置換しません。

私は、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 つの置換だけでこれを行う良い方法はないと思います。ただし、4 つの置換で問題ない場合は、次のように進めます。

  1. 置換します\A'( つまり、'文字列の先頭を置換します)。

  2. 置換します'\Zつまり、'文字列の末尾で置換します)。

  3. ([^[:alnum:]])'全体をに 置き換えます\1(つまり、英数字以外の文字とのすべてのシーケンスを'英数字以外の文字と に置き換えます)。

  4. '([^[: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に詳しくないので、正しい構文は次のようになるかもしれません

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

関連情報