Ich verwende den folgenden Code aus einem Bash-Skript, um einfache Anführungszeichen in meiner Titelspalte in einer Postgres-Datenbank durch Leerzeichen zu ersetzen.
psql -U postgres -d my_database -c "UPDATE my_table SET title = regexp_replace(title, '''', ' ', 'g')"
Mein Problem besteht darin, dass ich die einfachen Anführungszeichen um Zeichenfolgen entfernen wollte, beispielsweise folgendermaßen:
this is example 'number one' ok
wird
this is example number one ok
Dies funktioniert wie erhofft. Allerdings werden dabei auch die einfachen Anführungszeichen innerhalb von Wörtern entfernt, also:
can't
wird
can t
Wie kann ich angeben, dass ich nur die einfachen Anführungszeichen um Zeichenfolgen ersetzen möchte?
Antwort1
Ich glaube nicht, dass es eine gute Möglichkeit gibt, dies mit nur einem Ersatz zu tun. Aber wenn vier Ersatzteile in Ordnung sind, gehen Sie wie folgt vor:
Ersetzen
\A'
durch(d. h.
'
am Anfang der Zeichenfolge ersetzen).Ersetzen
'\Z
durch(d. h.
'
am Ende der Zeichenfolge ersetzen).Globales Ersetzen
([^[:alnum:]])'
durch\1
(d. h., jede Folge nicht alphanumerischer Zeichen und wird'
durch die nicht alphanumerischen Zeichen und ersetzt).
Global ersetzen
'([^[:alnum:]])
durch\1
(d. h., jede Folge von'
und einem nicht alphanumerischen Zeichen durchund das nicht alphanumerische Zeichen ersetzen.)
Der Nettoeffekt besteht darin, alle zu ersetzen '
, außer denen, die vorangestellt sindUndgefolgt von einem alphanumerischen Zeichen.
Haftungsausschluss: Ich habe keine Ahnung von PostgreSQL; Sie müssen es selbst in die PostgreSQL-Syntax übersetzen.
Antwort2
Verwenden Sie einen intelligenteren regulären Ausdruck: Wenn Sie " '
" und " '
" ( SPACE APOSTROPHEund APOSTROPHE SPACE) ersetzen, entfallen die Apostrophe innerhalb des Wortes.
Antwort3
Wenn Sie Apostrophe in Wörtern vermeiden möchten, suchen Sie nach Apostrophen, die links oder rechts keinen Buchstaben haben. Ein möglicher regulärer Ausdruck zum Suchen nach solchen Apostrophen könnte sein
([A-Za-z])\'([^A-Za-z])|([^A-Za-z])\'([A-Za-z])|([^A-Za-z])\'([^A-Za-z])
oder kürzer
\'([^A-Za-z])|([^A-Za-z])\'
oder noch kürzer
\'([^\w])|([^\w])\'
Ich denke, regexp_replace wäre
regexp_replace(title, '\'([^\w])|([^\w])\'', '\1', 'g')
Ich bin nicht vertraut mit psql, daher könnte die richtige Syntax sein
regexp_replace(title, '''([^\w])|([^\w])''', '\1', 'g')