Использование regexp_replace для замены одинарных кавычек вокруг строки, но не внутри слов, например, не может

Использование regexp_replace для замены одинарных кавычек вокруг строки, но не внутри слов, например, не может

Я использую приведенный ниже код из скрипта bash для замены одинарных кавычек в столбце title в базе данных 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 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')

Связанный контент